We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent e5b06c3 commit 86c83d2Copy full SHA for 86c83d2
clap_derive/src/attrs.rs
@@ -489,6 +489,49 @@ impl Attrs {
489
self.methods.push(Method::new(raw_ident, val));
490
}
491
492
+ DefaultValueOsT(ident, expr) => {
493
+ let ty = if let Some(ty) = self.ty.as_ref() {
494
+ ty
495
+ } else {
496
+ abort!(
497
+ ident,
498
+ "#[clap(default_value_os_t)] (without an argument) can be used \
499
+ only on field level";
500
+
501
+ note = "see \
502
+ https://github.com/clap-rs/clap/blob/master/examples/derive_ref/README.md#magic-attributes")
503
+ };
504
505
+ let val = if let Some(expr) = expr {
506
+ quote!(#expr)
507
508
+ quote!(<#ty as ::std::default::Default>::default())
509
510
511
+ let val = if parsed.iter().any(|a| matches!(a, ArgEnum(_))) {
512
+ quote_spanned!(ident.span()=> {
513
+ {
514
+ let val: #ty = #val;
515
+ clap::ArgEnum::to_possible_value(&val).unwrap().get_name()
516
+ }
517
+ })
518
519
520
+ clap::lazy_static::lazy_static! {
521
+ static ref DEFAULT_VALUE: &'static ::std::ffi::OsStr = {
522
523
+ let s: ::std::ffi::OsString = val.into();
524
+ ::std::boxed::Box::leak(s.into_boxed_os_str())
525
526
527
+ *DEFAULT_VALUE
528
529
530
531
+ let raw_ident = Ident::new("default_value_os", ident.span());
532
+ self.methods.push(Method::new(raw_ident, val));
533
534
535
HelpHeading(ident, expr) => {
536
self.help_heading = Some(Method::new(ident, quote!(#expr)));
537
clap_derive/src/parse.rs
@@ -53,6 +53,7 @@ pub enum ClapAttr {
53
// ident = arbitrary_expr
54
NameExpr(Ident, Expr),
55
DefaultValueT(Ident, Option<Expr>),
56
+ DefaultValueOsT(Ident, Option<Expr>),
57
HelpHeading(Ident, Expr),
58
59
// ident(arbitrary_expr,*)
@@ -129,6 +130,7 @@ impl Parse for ClapAttr {
129
130
Ok(expr) => match &*name_str {
131
"skip" => Ok(Skip(name, Some(expr))),
132
"default_value_t" => Ok(DefaultValueT(name, Some(expr))),
133
+ "default_value_os_t" => Ok(DefaultValueOsT(name, Some(expr))),
134
"help_heading" => Ok(HelpHeading(name, expr)),
135
_ => Ok(NameExpr(name, expr)),
136
},
@@ -203,6 +205,7 @@ impl Parse for ClapAttr {
203
205
)
204
206
207
"default_value_t" => Ok(DefaultValueT(name, None)),
208
+ "default_value_os_t" => Ok(DefaultValueOsT(name, None)),
209
"about" => (Ok(About(name, None))),
210
"author" => (Ok(Author(name, None))),
211
"version" => Ok(Version(name, None)),
examples/derive_ref/README.md
@@ -185,6 +185,9 @@ In addition to the raw attributes, the following magic attributes are supported:
185
- `default_value_t [= <expr>]`: `clap::Arg::default_value` and `clap::Arg::required(false)`
186
- Requires `std::fmt::Display` or `#[clap(arg_enum)]`
187
- Without `<expr>`, relies on `Default::default()`
188
+- `default_value_os_t [= <expr>]`: `clap::Arg::default_value_os` and `clap::Arg::required(false)`
189
+ - Requires `std::convert::Into<OsString>` or `#[clap(arg_enum)]`
190
+ - Without `<expr>`, relies on `Default::default()`
191
192
### Arg Types
193
0 commit comments