checked_rs_macro_impl/params/
behavior_arg.rs

1use proc_macro2::TokenStream;
2use quote::{quote, ToTokens};
3use syn::parse::Parse;
4
5use super::{kw, PanicOrPanicking, SaturateOrSaturating};
6
7#[derive(Clone)]
8pub enum BehaviorArg {
9    Saturating(SaturateOrSaturating),
10    Panicking(PanicOrPanicking),
11}
12
13impl Parse for BehaviorArg {
14    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
15        if input.peek(kw::Saturate) || input.peek(kw::Saturating) {
16            Ok(Self::Saturating(input.parse()?))
17        } else if input.peek(kw::Panic) || input.peek(kw::Panicking) {
18            Ok(Self::Panicking(input.parse()?))
19        } else {
20            Err(input.error("expected `Saturating` or `Panicking`"))
21        }
22    }
23}
24
25impl ToTokens for BehaviorArg {
26    fn to_tokens(&self, tokens: &mut TokenStream) {
27        tokens.extend(match self {
28            Self::Saturating(..) => quote! {
29                Saturating
30            },
31            Self::Panicking(..) => quote! {
32                Panicking
33            },
34        });
35    }
36}
37
38impl std::fmt::Debug for BehaviorArg {
39    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
40        match self {
41            Self::Saturating(..) => write!(f, "Saturating"),
42            Self::Panicking(..) => write!(f, "Panicking"),
43        }
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50    use crate::{assert_parse, snapshot};
51
52    #[test]
53    fn parse_saturating() {
54        assert_parse!(BehaviorArg => { Saturating } => { BehaviorArg::Saturating(..) });
55    }
56
57    #[test]
58    fn parse_saturate() {
59        assert_parse!(BehaviorArg => { Saturate } => { BehaviorArg::Saturating(..) });
60    }
61
62    #[test]
63    fn parse_panicking() {
64        assert_parse!(BehaviorArg => { Panicking } => { BehaviorArg::Panicking(..) });
65    }
66
67    #[test]
68    fn parse_panic() {
69        assert_parse!(BehaviorArg => { Panic } => { BehaviorArg::Panicking(..) });
70    }
71
72    #[test]
73    fn to_tokens_saturating() {
74        snapshot!(BehaviorArg => { Saturating });
75    }
76
77    #[test]
78    fn to_tokens_panicking() {
79        snapshot!(BehaviorArg => { Panicking });
80    }
81}