Skip to main content

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::{ensure_exhausted, 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!(ensure_exhausted(&mut iter));
24    unwrap_or_return!(Type::<false>::from_min_max(&min, &max)).into_tokens()
25}
26
27#[allow(missing_docs)] // documented in re-export in `deranged`
28#[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}