1#[cfg(feature = "i128")]
2use std::num::{NonZeroI128, NonZeroU128};
3use std::num::{
4 NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU16, NonZeroU32,
5 NonZeroU64, NonZeroU8, NonZeroUsize,
6};
7
8#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
9pub enum Number {
10 I8(i8),
11 I16(i16),
12 I32(i32),
13 I64(i64),
14 #[cfg(feature = "i128")]
15 I128(i128),
16 Isize(isize),
17 U8(u8),
18 U16(u16),
19 U32(u32),
20 U64(u64),
21 #[cfg(feature = "i128")]
22 U128(u128),
23 Usize(usize),
24 NonZeroI8(NonZeroI8),
25 NonZeroI16(NonZeroI16),
26 NonZeroI32(NonZeroI32),
27 NonZeroI64(NonZeroI64),
28 #[cfg(feature = "i128")]
29 NonZeroI128(NonZeroI128),
30 NonZeroIsize(NonZeroIsize),
31 NonZeroU8(NonZeroU8),
32 NonZeroU16(NonZeroU16),
33 NonZeroU32(NonZeroU32),
34 NonZeroU64(NonZeroU64),
35 #[cfg(feature = "i128")]
36 NonZeroU128(NonZeroU128),
37 NonZeroUsize(NonZeroUsize),
38 F32(f32),
39 F64(f64),
40}
41
42impl std::fmt::Display for Number {
43 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
44 match *self {
45 Number::I8(num) => write!(f, "{:?}", num),
46 Number::I16(num) => write!(f, "{:?}", num),
47 Number::I32(num) => write!(f, "{:?}", num),
48 Number::I64(num) => write!(f, "{:?}", num),
49 #[cfg(feature = "i128")]
50 Number::I128(num) => write!(f, "{:?}", num),
51 Number::Isize(num) => write!(f, "{:?}", num),
52 Number::U8(num) => write!(f, "{:?}", num),
53 Number::U16(num) => write!(f, "{:?}", num),
54 Number::U32(num) => write!(f, "{:?}", num),
55 Number::U64(num) => write!(f, "{:?}", num),
56 #[cfg(feature = "i128")]
57 Number::U128(num) => write!(f, "{:?}", num),
58 Number::Usize(num) => write!(f, "{:?}", num),
59 Number::NonZeroI8(num) => write!(f, "{:?}", num),
60 Number::NonZeroI16(num) => write!(f, "{:?}", num),
61 Number::NonZeroI32(num) => write!(f, "{:?}", num),
62 Number::NonZeroI64(num) => write!(f, "{:?}", num),
63 #[cfg(feature = "i128")]
64 Number::NonZeroI128(num) => write!(f, "{:?}", num),
65 Number::NonZeroIsize(num) => write!(f, "{:?}", num),
66 Number::NonZeroU8(num) => write!(f, "{:?}", num),
67 Number::NonZeroU16(num) => write!(f, "{:?}", num),
68 Number::NonZeroU32(num) => write!(f, "{:?}", num),
69 Number::NonZeroU64(num) => write!(f, "{:?}", num),
70 #[cfg(feature = "i128")]
71 Number::NonZeroU128(num) => write!(f, "{:?}", num),
72 Number::NonZeroUsize(num) => write!(f, "{:?}", num),
73 Number::F32(num) => write!(f, "{:?}", num),
74 Number::F64(num) => write!(f, "{:?}", num),
75 }
76 }
77}
78
79macro_rules! impl_from_trait {
80 ($type:ty) => {
81 paste::paste! {
82 impl From<$type> for Number {
83 fn from(item: $type) -> Self {
84 Number::[<$type:camel>](item)
85 }
86 }
87
88 impl From<&$type> for Number {
89 fn from(item: &$type) -> Self {
90 Number::[<$type:camel>](*item)
91 }
92 }
93 }
94 };
95}
96
97impl_from_trait!(i8);
98impl_from_trait!(i16);
99impl_from_trait!(i32);
100impl_from_trait!(i64);
101#[cfg(feature = "i128")]
102impl_from_trait!(i128);
103impl_from_trait!(isize);
104impl_from_trait!(u8);
105impl_from_trait!(u16);
106impl_from_trait!(u32);
107impl_from_trait!(u64);
108#[cfg(feature = "i128")]
109impl_from_trait!(u128);
110impl_from_trait!(usize);
111impl_from_trait!(NonZeroI8);
112impl_from_trait!(NonZeroI16);
113impl_from_trait!(NonZeroI32);
114impl_from_trait!(NonZeroI64);
115#[cfg(feature = "i128")]
116impl_from_trait!(NonZeroI128);
117impl_from_trait!(NonZeroIsize);
118impl_from_trait!(NonZeroU8);
119impl_from_trait!(NonZeroU16);
120impl_from_trait!(NonZeroU32);
121impl_from_trait!(NonZeroU64);
122#[cfg(feature = "i128")]
123impl_from_trait!(NonZeroU128);
124impl_from_trait!(NonZeroUsize);
125impl_from_trait!(f32);
126impl_from_trait!(f64);