Skip to content

Commit

Permalink
Call unraw() on idents (#186)
Browse files Browse the repository at this point in the history
This changes argh_derive to allow using raw struct field identifiers
(e.g., `r#move`) as long names.

Closes #124
  • Loading branch information
xzfc committed Feb 1, 2024
1 parent 1aa3e52 commit e901d3a
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 1 deletion.
14 changes: 14 additions & 0 deletions argh/tests/lib.rs
Expand Up @@ -364,6 +364,20 @@ fn explicit_long_value_for_option() {
assert_eq!(cmd.x, 5);
}

#[test]
fn raw_identifier() {
#[derive(FromArgs, Debug)]
/// Short description
struct Cmd {
#[argh(switch)]
/// whether to move the file
r#move: bool,
}

let cmd = Cmd::from_args(&["cmdname"], &["--move"]).unwrap();
assert!(cmd.r#move);
}

/// Test that descriptions can start with an initialism despite
/// usually being required to start with a lowercase letter.
#[derive(FromArgs)]
Expand Down
4 changes: 3 additions & 1 deletion argh_derive/src/lib.rs
Expand Up @@ -3,6 +3,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

use syn::ext::IdentExt as _;

/// Implementation of the `FromArgs` and `argh(...)` derive attributes.
///
/// For more thorough documentation, see the `argh` crate itself.
Expand Down Expand Up @@ -195,7 +197,7 @@ impl<'a> StructField<'a> {
let long_name = match kind {
FieldKind::Switch | FieldKind::Option => {
let long_name = attrs.long.as_ref().map(syn::LitStr::value).unwrap_or_else(|| {
let kebab_name = to_kebab_case(&name.to_string());
let kebab_name = to_kebab_case(&name.unraw().to_string());
check_long_name(errors, name, &kebab_name);
kebab_name
});
Expand Down

0 comments on commit e901d3a

Please sign in to comment.