Skip to content

Commit 6bbb90f

Browse files
committed
bpaf_derive: support enter as post decor
1 parent ce41b35 commit 6bbb90f

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

bpaf_derive/src/attrs.rs

+9
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ impl ToTokens for PostDecor {
254254
PostDecor::Hide { .. } => quote!(hide()),
255255
PostDecor::CustomUsage { usage, .. } => quote!(custom_usage(#usage)),
256256
PostDecor::HideUsage { .. } => quote!(hide_usage()),
257+
PostDecor::Enter { name, .. } => quote!(enter(#name)),
257258
}
258259
.to_tokens(tokens);
259260
}
@@ -339,6 +340,10 @@ pub(crate) enum PostDecor {
339340
HideUsage {
340341
span: Span,
341342
},
343+
Enter {
344+
name: Box<Expr>,
345+
span: Span,
346+
},
342347
}
343348
impl PostDecor {
344349
fn span(&self) -> Span {
@@ -355,6 +360,7 @@ impl PostDecor {
355360
| Self::Guard { span, .. }
356361
| Self::Hide { span }
357362
| Self::CustomUsage { span, .. }
363+
| Self::Enter { span, .. }
358364
| Self::HideUsage { span } => *span,
359365
}
360366
}
@@ -544,6 +550,9 @@ impl PostDecor {
544550
} else if kw == "custom_usage" {
545551
let usage = parse_arg(input)?;
546552
Self::CustomUsage { usage, span }
553+
} else if kw == "enter" {
554+
let name = parse_expr(input)?;
555+
Self::Enter { span, name }
547556
} else {
548557
return Ok(None);
549558
}))

bpaf_derive/src/top_tests.rs

+21
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,27 @@ fn top_struct_construct() {
4646
assert_eq!(top.to_token_stream().to_string(), expected.to_string());
4747
}
4848

49+
#[test]
50+
fn top_struct_enter() {
51+
let top: Top = parse_quote! {
52+
#[bpaf(enter("opt"))]
53+
struct Opt { #[bpaf(enter("bar"))] verbose: bool }
54+
};
55+
56+
let expected = quote! {
57+
fn opt() -> impl ::bpaf::Parser<Opt> {
58+
#[allow (unused_imports)]
59+
use ::bpaf::Parser;
60+
{
61+
let verbose = ::bpaf::long("verbose").switch().enter("bar");
62+
::bpaf::construct!(Opt { verbose, })
63+
}.enter("opt")
64+
}
65+
};
66+
67+
assert_eq!(top.to_token_stream().to_string(), expected.to_string());
68+
}
69+
4970
#[test]
5071
fn top_enum_construct() {
5172
let top: Top = parse_quote! {

0 commit comments

Comments
 (0)