checked_rs_macro_impl/params/
upper_or_max.rs

1use proc_macro2::TokenStream;
2use quote::ToTokens;
3use syn::parse::Parse;
4
5use super::kw;
6
7#[derive(Clone)]
8pub enum UpperOrMax {
9    Upper(kw::upper),
10    Max(kw::max),
11}
12
13impl Parse for UpperOrMax {
14    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
15        if input.peek(kw::upper) {
16            Ok(Self::Upper(input.parse()?))
17        } else if input.peek(kw::max) {
18            Ok(Self::Max(input.parse()?))
19        } else {
20            Err(input.error("expected `upper` or `max`"))
21        }
22    }
23}
24
25impl ToTokens for UpperOrMax {
26    fn to_tokens(&self, tokens: &mut TokenStream) {
27        match self {
28            Self::Upper(kw) => kw.to_tokens(tokens),
29            Self::Max(kw) => kw.to_tokens(tokens),
30        }
31    }
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37    use crate::{assert_parse, snapshot};
38
39    #[test]
40    fn parse_upper() {
41        assert_parse!(UpperOrMax => { upper } => { UpperOrMax::Upper(..) });
42    }
43
44    #[test]
45    fn parse_max() {
46        assert_parse!(UpperOrMax => { max } => { UpperOrMax::Max(..) });
47    }
48
49    #[test]
50    fn snapshot_upper() {
51        snapshot!(UpperOrMax => { upper });
52    }
53
54    #[test]
55    fn snapshot_max() {
56        snapshot!(UpperOrMax => { max });
57    }
58}