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);
39from_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]
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}