deranged_macros/
lib.rs

1//! Macros for the `deranged` crate.
2
3#![doc(test(attr(deny(warnings))))]
4
5mod helpers;
6mod integer;
7mod ty;
8
9use proc_macro::TokenStream;
10
11use crate::helpers::{parse_comma, unwrap_or_return};
12use crate::integer::Integer;
13use crate::ty::Type;
14
15#[allow(missing_docs)] // documented in re-export in `deranged`
16#[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!(Type::<false>::from_min_max(&min, &max)).into_tokens()
24}
25
26#[allow(missing_docs)] // documented in re-export in `deranged`
27#[proc_macro]
28pub fn opt_int(input: TokenStream) -> TokenStream {
29    let mut iter = input.into_iter();
30
31    let min = unwrap_or_return!(Integer::try_from_tokens(&mut iter, "minimum value"));
32    unwrap_or_return!(parse_comma(&mut iter));
33    let max = unwrap_or_return!(Integer::try_from_tokens(&mut iter, "maximum value"));
34    unwrap_or_return!(Type::<true>::from_min_max(&min, &max)).into_tokens()
35}