checked_rs_macro_impl/params/
number_kind.rs1use proc_macro2::TokenStream;
2use quote::ToTokens;
3use syn::parse::Parse;
4
5#[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}