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