checked_rs_macro_impl/params/
upper_or_max.rs1use 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}