Skip to content

Commit 4adb147

Browse files
authored
Fix domain for explorer (#51)
* Cargo.toml - add `derive_more` * domain - BigNum - use `derive_more` and derive `Add`, `Div`, `Mul` & `Sub` * domain - BigNum - impl `Sum` iterator * domain - BigNum - derive `Ord` * domain - BigNum - derive `PartialEq`, `Eq`, `PartialOrd` & `Ord` * domain - BigNum - fix `impl Sum<BigNum>` to a `Sum<&'a BigNum>` * domain - BigNum - Impl `Mul`, `Div` `Sum<&BigNum>` & `Sum<BigNum>` + other methods from BigUint
1 parent 344df80 commit 4adb147

File tree

6 files changed

+111
-20
lines changed

6 files changed

+111
-20
lines changed

Cargo.lock

Lines changed: 46 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

domain/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ num-bigint = { version = "0.2", features = ["serde"] }
2020
chrono = { version = "0.4", features = ["serde"] }
2121
time = "0.1.42"
2222
hex = "0.3.2"
23+
num = "0.2.0"
2324
# Fixtures
2425
fake = { version = "^1.3", features = ["chrono"], optional = true }
2526
rand = { version = "^0.6", optional = true }

domain/src/bignum.rs

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
use std::convert::TryFrom;
22
use std::error::Error;
3+
use std::iter::Sum;
34
use std::str::FromStr;
45

56
use num_bigint::BigUint;
67
use serde::{Deserialize, Deserializer, Serialize, Serializer};
8+
use std::ops::{Div, Mul};
79

8-
#[derive(Serialize, Deserialize, Debug, Clone)]
10+
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
911
pub struct BigNum(
1012
#[serde(
1113
deserialize_with = "biguint_from_str",
@@ -18,6 +20,58 @@ impl BigNum {
1820
pub fn new(num: BigUint) -> Result<Self, super::DomainError> {
1921
Ok(Self(num))
2022
}
23+
24+
pub fn div_floor(&self, other: &Self) -> Self {
25+
use num::integer::Integer;
26+
27+
Self(self.0.div_floor(&other.0))
28+
}
29+
30+
pub fn to_f64(&self) -> Option<f64> {
31+
use num::traits::cast::ToPrimitive;
32+
33+
self.0.to_f64()
34+
}
35+
36+
pub fn to_u64(&self) -> Option<u64> {
37+
use num::traits::cast::ToPrimitive;
38+
39+
self.0.to_u64()
40+
}
41+
}
42+
43+
impl Div<&BigNum> for &BigNum {
44+
type Output = BigNum;
45+
46+
fn div(self, rhs: &BigNum) -> Self::Output {
47+
let big_uint = &self.0 / &rhs.0;
48+
BigNum(big_uint.to_owned())
49+
}
50+
}
51+
52+
impl Mul<&BigNum> for &BigNum {
53+
type Output = BigNum;
54+
55+
fn mul(self, rhs: &BigNum) -> Self::Output {
56+
let big_uint = &self.0 * &rhs.0;
57+
BigNum(big_uint.to_owned())
58+
}
59+
}
60+
61+
impl<'a> Sum<&'a BigNum> for BigNum {
62+
fn sum<I: Iterator<Item = &'a BigNum>>(iter: I) -> Self {
63+
let sum_uint = iter.map(|big_num| &big_num.0).sum();
64+
65+
Self(sum_uint)
66+
}
67+
}
68+
69+
impl Sum<BigNum> for BigNum {
70+
fn sum<I: Iterator<Item = BigNum>>(iter: I) -> Self {
71+
let sum_uint = iter.map(|big_num| big_num.0).sum();
72+
73+
Self(sum_uint)
74+
}
2175
}
2276

2377
impl TryFrom<&str> for BigNum {
@@ -37,11 +91,9 @@ impl ToString for BigNum {
3791
}
3892
}
3993

40-
impl TryFrom<u32> for BigNum {
41-
type Error = super::DomainError;
42-
43-
fn try_from(value: u32) -> Result<Self, Self::Error> {
44-
BigNum::new(BigUint::from(value))
94+
impl From<u64> for BigNum {
95+
fn from(value: u64) -> Self {
96+
BigNum(BigUint::from(value))
4597
}
4698
}
4799

domain/src/channel_fixtures.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
use std::convert::TryFrom;
2-
31
use chrono::{DateTime, Utc};
42
use fake::faker::*;
53

@@ -33,8 +31,7 @@ pub fn get_channel(
3331
spec: Option<ChannelSpec>,
3432
) -> Channel {
3533
let channel_id = get_channel_id(id);
36-
let deposit_amount = BigNum::try_from(<Faker as Number>::between(100_u32, 5000_u32))
37-
.expect("BigNum error when creating from random number");
34+
let deposit_amount = BigNum::from(<Faker as Number>::between(100, 5000));
3835
let valid_until: DateTime<Utc> =
3936
valid_until.unwrap_or(test_util::time::datetime_between(&Utc::now(), None));
4037
let creator = <Faker as Name>::name();
@@ -84,12 +81,9 @@ pub fn get_channel_spec(prefix: &str, validators_option: ValidatorsOption) -> Ch
8481
let title_string = Some(<Faker as Lorem>::sentence(3, 4));
8582

8683
let title = take_one(&[&title_string, &None]).to_owned();
87-
let max_per_impression = BigNum::try_from(<Faker as Number>::between(250_u32, 500_u32))
88-
.expect("BigNum error when creating from random number");
89-
let min_per_impression = BigNum::try_from(<Faker as Number>::between(1_u32, 250_u32))
90-
.expect("BigNum error when creating from random number");
91-
let nonce = BigNum::try_from(<Faker as Number>::between(100_000_000_u32, 999_999_999_u32))
92-
.expect("BigNum error when creating from random number");
84+
let max_per_impression = BigNum::from(<Faker as Number>::between(250, 500));
85+
let min_per_impression = BigNum::from(<Faker as Number>::between(1, 250));
86+
let nonce = BigNum::from(<Faker as Number>::between(100_000_000, 999_999_999));
9387
let min_targeting_score =
9488
take_one(&[&None, &Some(<Faker as Number>::between(1, 500))]).to_owned();
9589

domain/src/targeting_tag.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub struct Score(#[serde(deserialize_with = "score_deserialize")] u8);
1414

1515
impl Score {
1616
/// score should be between 0 and 100
17+
#[allow(dead_code)]
1718
fn new(score: u8) -> Result<Self, DomainError> {
1819
if score > 100 {
1920
return Err(DomainError::InvalidArgument(

domain/src/validator.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,14 @@ pub struct ValidatorDesc {
1212

1313
#[cfg(any(test, feature = "fixtures"))]
1414
pub(crate) mod fixtures {
15-
use std::convert::TryFrom;
16-
1715
use fake::faker::*;
1816

1917
use crate::BigNum;
2018

2119
use super::ValidatorDesc;
2220

2321
pub fn get_validator(validator_id: &str) -> ValidatorDesc {
24-
let fee = BigNum::try_from(<Faker as Number>::between(1_u32, 13_u32))
25-
.expect("BigNum error when creating from random number");
22+
let fee = BigNum::from(<Faker as Number>::between(1, 13));
2623
let url = format!("http://{}-validator-url.com/validator", validator_id);
2724

2825
ValidatorDesc {

0 commit comments

Comments
 (0)