ac_primitives/
rpc_numbers.rs1use core::fmt::Debug;
25use primitive_types::U256;
26use serde::{Deserialize, Serialize};
27
28#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)]
37#[serde(untagged)]
38pub enum NumberOrHex {
39 Number(u64),
41 Hex(U256),
43}
44
45impl Default for NumberOrHex {
46 fn default() -> Self {
47 Self::Number(Default::default())
48 }
49}
50
51impl NumberOrHex {
52 pub fn into_u256(self) -> U256 {
54 match self {
55 NumberOrHex::Number(n) => n.into(),
56 NumberOrHex::Hex(h) => h,
57 }
58 }
59}
60
61impl From<u32> for NumberOrHex {
62 fn from(n: u32) -> Self {
63 NumberOrHex::Number(n.into())
64 }
65}
66
67impl From<u64> for NumberOrHex {
68 fn from(n: u64) -> Self {
69 NumberOrHex::Number(n)
70 }
71}
72
73impl From<u128> for NumberOrHex {
74 fn from(n: u128) -> Self {
75 NumberOrHex::Hex(n.into())
76 }
77}
78
79impl From<U256> for NumberOrHex {
80 fn from(n: U256) -> Self {
81 NumberOrHex::Hex(n)
82 }
83}
84
85pub struct TryFromIntError(pub(crate) ());
87
88impl TryFrom<NumberOrHex> for u32 {
89 type Error = TryFromIntError;
90 fn try_from(num_or_hex: NumberOrHex) -> Result<u32, Self::Error> {
91 num_or_hex.into_u256().try_into().map_err(|_| TryFromIntError(()))
92 }
93}
94
95impl TryFrom<NumberOrHex> for u64 {
96 type Error = TryFromIntError;
97 fn try_from(num_or_hex: NumberOrHex) -> Result<u64, Self::Error> {
98 num_or_hex.into_u256().try_into().map_err(|_| TryFromIntError(()))
99 }
100}
101
102impl TryFrom<NumberOrHex> for u128 {
103 type Error = TryFromIntError;
104 fn try_from(num_or_hex: NumberOrHex) -> Result<u128, Self::Error> {
105 num_or_hex.into_u256().try_into().map_err(|_| TryFromIntError(()))
106 }
107}
108
109impl From<NumberOrHex> for U256 {
110 fn from(num_or_hex: NumberOrHex) -> U256 {
111 num_or_hex.into_u256()
112 }
113}