diff --git a/bpaf_derive/src/attrs.rs b/bpaf_derive/src/attrs.rs index 4f665acf..0627e0d9 100644 --- a/bpaf_derive/src/attrs.rs +++ b/bpaf_derive/src/attrs.rs @@ -217,6 +217,7 @@ impl ToTokens for PostParse { PostParse::Optional { .. } => quote!(optional()), PostParse::Parse { f, .. } => quote!(parse(#f)), PostParse::Strict { .. } => quote!(strict()), + PostParse::Anywhere { .. } => quote!(anywhere()), } .to_tokens(tokens); } @@ -255,6 +256,7 @@ pub(crate) enum PostParse { Optional { span: Span }, Parse { span: Span, f: Box }, Strict { span: Span }, + Anywhere { span: Span }, } impl PostParse { fn span(&self) -> Span { @@ -268,7 +270,8 @@ impl PostParse { | Self::Map { span, .. } | Self::Optional { span } | Self::Parse { span, .. } - | Self::Strict { span } => *span, + | Self::Strict { span } + | Self::Anywhere { span } => *span, } } } @@ -480,6 +483,8 @@ impl PostParse { } else if kw == "some" { let msg = parse_arg(input)?; Self::Some_ { span, msg } + } else if kw == "anywhere" { + Self::Anywhere { span } } else { return Ok(None); })) diff --git a/bpaf_derive/src/field_tests.rs b/bpaf_derive/src/field_tests.rs index 45a37f50..1bc3e0e2 100644 --- a/bpaf_derive/src/field_tests.rs +++ b/bpaf_derive/src/field_tests.rs @@ -947,3 +947,15 @@ fn raw_literal() { }; assert_eq!(input.to_token_stream().to_string(), output.to_string()); } + +#[test] +fn any_anywhere() { + let input: NamedField = parse_quote! { + #[bpaf(any::("LIMIT", isize_to_usize), anywhere)] + num: isize + }; + let output = quote! { + ::bpaf::any::("LIMIT", isize_to_usize).anywhere() + }; + assert_eq!(input.to_token_stream().to_string(), output.to_string()); +}