checked_rs_macro_impl/params/
number_kind.rs

1use proc_macro2::TokenStream;
2use quote::ToTokens;
3use syn::parse::Parse;
4
5/// Represents the size of number.
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum NumberKind {
8    U8,
9    U16,
10    U32,
11    U64,
12    U128,
13    USize,
14    I8,
15    I16,
16    I32,
17    I64,
18    I128,
19    ISize,
20}
21
22impl Parse for NumberKind {
23    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
24        let ident = input.parse::<syn::Ident>()?;
25        match ident.to_string().as_str() {
26            "u8" => Ok(Self::U8),
27            "u16" => Ok(Self::U16),
28            "u32" => Ok(Self::U32),
29            "u64" => Ok(Self::U64),
30            "u128" => Ok(Self::U128),
31            "usize" => Ok(Self::USize),
32            "i8" => Ok(Self::I8),
33            "i16" => Ok(Self::I16),
34            "i32" => Ok(Self::I32),
35            "i64" => Ok(Self::I64),
36            "i128" => Ok(Self::I128),
37            "isize" => Ok(Self::ISize),
38            _ => Err(input.error("expected a number kind")),
39        }
40    }
41}
42
43impl ToTokens for NumberKind {
44    fn to_tokens(&self, tokens: &mut TokenStream) {
45        let kind = match self {
46            Self::U8 => "u8",
47            Self::U16 => "u16",
48            Self::U32 => "u32",
49            Self::U64 => "u64",
50            Self::U128 => "u128",
51            Self::USize => "usize",
52            Self::I8 => "i8",
53            Self::I16 => "i16",
54            Self::I32 => "i32",
55            Self::I64 => "i64",
56            Self::I128 => "i128",
57            Self::ISize => "isize",
58        };
59
60        tokens.extend(syn::parse_str::<TokenStream>(kind).unwrap());
61    }
62}
63
64impl std::fmt::Display for NumberKind {
65    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
66        let kind = match self {
67            Self::U8 => "u8",
68            Self::U16 => "u16",
69            Self::U32 => "u32",
70            Self::U64 => "u64",
71            Self::U128 => "u128",
72            Self::USize => "usize",
73            Self::I8 => "i8",
74            Self::I16 => "i16",
75            Self::I32 => "i32",
76            Self::I64 => "i64",
77            Self::I128 => "i128",
78            Self::ISize => "isize",
79        };
80
81        write!(f, "{}", kind)
82    }
83}
84
85#[cfg(test)]
86mod tests {
87    use super::*;
88    use crate::{assert_parse, snapshot};
89
90    #[test]
91    fn parse_u8() {
92        assert_parse!(NumberKind => { u8 } => { NumberKind::U8 });
93    }
94
95    #[test]
96    fn parse_u16() {
97        assert_parse!(NumberKind => { u16 } => { NumberKind::U16 });
98    }
99
100    #[test]
101    fn parse_u32() {
102        assert_parse!(NumberKind => { u32 } => { NumberKind::U32 });
103    }
104
105    #[test]
106    fn parse_u64() {
107        assert_parse!(NumberKind => { u64 } => { NumberKind::U64 });
108    }
109
110    #[test]
111    fn parse_u128() {
112        assert_parse!(NumberKind => { u128 } => { NumberKind::U128 });
113    }
114
115    #[test]
116    fn parse_usize() {
117        assert_parse!(NumberKind => { usize } => { NumberKind::USize });
118    }
119
120    #[test]
121    fn parse_i8() {
122        assert_parse!(NumberKind => { i8 } => { NumberKind::I8 });
123    }
124
125    #[test]
126    fn parse_i16() {
127        assert_parse!(NumberKind => { i16 } => { NumberKind::I16 });
128    }
129
130    #[test]
131    fn parse_i32() {
132        assert_parse!(NumberKind => { i32 } => { NumberKind::I32 });
133    }
134
135    #[test]
136    fn parse_i64() {
137        assert_parse!(NumberKind => { i64 } => { NumberKind::I64 });
138    }
139
140    #[test]
141    fn parse_i128() {
142        assert_parse!(NumberKind => { i128 } => { NumberKind::I128 });
143    }
144
145    #[test]
146    fn parse_isize() {
147        assert_parse!(NumberKind => { isize } => { NumberKind::ISize });
148    }
149
150    #[test]
151    fn snapshot_u8() {
152        snapshot!(NumberKind => { u8 });
153    }
154
155    #[test]
156    fn snapshot_u16() {
157        snapshot!(NumberKind => { u16 });
158    }
159
160    #[test]
161    fn snapshot_u32() {
162        snapshot!(NumberKind => { u32 });
163    }
164
165    #[test]
166    fn snapshot_u64() {
167        snapshot!(NumberKind => { u64 });
168    }
169
170    #[test]
171    fn snapshot_u128() {
172        snapshot!(NumberKind => { u128 });
173    }
174
175    #[test]
176    fn snapshot_usize() {
177        snapshot!(NumberKind => { usize });
178    }
179
180    #[test]
181    fn snapshot_i8() {
182        snapshot!(NumberKind => { i8 });
183    }
184
185    #[test]
186    fn snapshot_i16() {
187        snapshot!(NumberKind => { i16 });
188    }
189
190    #[test]
191    fn snapshot_i32() {
192        snapshot!(NumberKind => { i32 });
193    }
194
195    #[test]
196    fn snapshot_i64() {
197        snapshot!(NumberKind => { i64 });
198    }
199
200    #[test]
201    fn snapshot_i128() {
202        snapshot!(NumberKind => { i128 });
203    }
204
205    #[test]
206    fn snapshot_isize() {
207        snapshot!(NumberKind => { isize });
208    }
209}