1#![doc(test(attr(deny(warnings))))]
4
5mod helpers;
6mod integer;
7mod ty;
8
9use proc_macro::TokenStream;
10
11use crate::helpers::{ensure_exhausted, parse_comma, unwrap_or_return};
12use crate::integer::Integer;
13use crate::ty::Type;
14
15#[allow(missing_docs)] #[proc_macro]
17pub fn int(input: TokenStream) -> TokenStream {
18 let mut iter = input.into_iter();
19
20 let min = unwrap_or_return!(Integer::try_from_tokens(&mut iter, "minimum value"));
21 unwrap_or_return!(parse_comma(&mut iter));
22 let max = unwrap_or_return!(Integer::try_from_tokens(&mut iter, "maximum value"));
23 unwrap_or_return!(ensure_exhausted(&mut iter));
24 unwrap_or_return!(Type::<false>::from_min_max(&min, &max)).into_tokens()
25}
26
27#[allow(missing_docs)] #[proc_macro]
29pub fn opt_int(input: TokenStream) -> TokenStream {
30 let mut iter = input.into_iter();
31
32 let min = unwrap_or_return!(Integer::try_from_tokens(&mut iter, "minimum value"));
33 unwrap_or_return!(parse_comma(&mut iter));
34 let max = unwrap_or_return!(Integer::try_from_tokens(&mut iter, "maximum value"));
35 unwrap_or_return!(ensure_exhausted(&mut iter));
36 unwrap_or_return!(Type::<true>::from_min_max(&min, &max)).into_tokens()
37}