bn_rs/bn/
into.rs

1use primitive_types::{H128, H160, H256, H512, U128, U256, U512};
2
3use super::BN;
4
5macro_rules! from_primitive {
6    ($type:ty) => {
7        impl From<$type> for BN {
8            fn from(value: $type) -> Self {
9                let bytes = value
10                    .0
11                    .into_iter()
12                    .rev()
13                    .flat_map(|e| e.to_be_bytes())
14                    .collect::<Vec<_>>();
15
16                BN::new_from_array(bytes.as_slice(), 10)
17            }
18        }
19    };
20}
21
22macro_rules! from_std {
23    ($type:ty) => {
24        impl From<$type> for BN {
25            fn from(value: $type) -> Self {
26                BN::new_from_array(&value.to_be_bytes(), 10)
27            }
28        }
29    };
30}
31
32from_primitive!(U128);
33from_primitive!(U256);
34from_primitive!(U512);
35from_primitive!(H128);
36from_primitive!(H160);
37from_primitive!(H256);
38from_primitive!(H512);
39// from_std!(isize);
40// from_std!(i8);
41// from_std!(i16);
42// from_std!(i32);
43// from_std!(i64);
44// from_std!(i128);
45from_std!(usize);
46from_std!(u8);
47from_std!(u16);
48from_std!(u32);
49from_std!(u64);
50from_std!(u128);
51
52#[cfg(test)]
53mod tests {
54    use primitive_types::{H256, U128, U256};
55    use wasm_bindgen_test::*;
56
57    use super::BN;
58
59    #[wasm_bindgen_test]
60    fn primitive_uint() {
61        let value = U256::MAX - U256::from(U128::MAX);
62        let bn = BN::from(value.clone());
63
64        assert_eq!(U256::try_from(bn).unwrap(), value);
65    }
66
67    #[wasm_bindgen_test]
68    fn primitive_hash() {
69        let value = H256::from(
70            <[u8; 32]>::try_from([[u8::MAX; 8], [0; 8], [0; 8], [u8::MAX; 8]].concat()).unwrap(),
71        );
72        let bn = BN::from(value.clone());
73
74        assert_eq!(H256::try_from(bn).unwrap(), value);
75    }
76
77    // #[wasm_bindgen_test]
78    // fn std_int() {
79    //     let value = i128::MAX - i64::MAX as i128;
80    //     let bn = BN::from(value.clone());
81    //
82    //     assert_eq!(i128::try_from(bn).unwrap(), value);
83    // }
84
85    #[wasm_bindgen_test]
86    fn std_uint() {
87        let value = u128::MAX - u64::MAX as u128;
88        let bn = BN::from(value.clone());
89
90        assert_eq!(u128::try_from(bn).unwrap(), value);
91    }
92}