Repository: google/argh (language: rust)

Issue:
Unrecognized argument on raw identifier
## Demo

```rs
use argh::FromArgs;

/// An example CLI application
#[derive(FromArgs)]
struct Example {
    /// the type (as a usize) to be used
    #[argh(option)]
    r#type: usize,
}

fn main() {
    let _up: Example = argh::from_env();
}
```
then folllowing `cargo run -- --type 1` the output is:
```
warning: field is never read: `type`
 --> src/main.rs:8:5
  |
8 |     r#type: usize,
  |     ^^^^^^^^^^^^^
  |
  = note: `#[warn(dead_code)]` on by default

warning: `arghtest` (bin "arghtest") generated 1 warning
    Finished dev [unoptimized + debuginfo] target(s) in 0.33s
     Running `target/debug/arghtest --type 1`
Unrecognized argument: --type
```


Discussion / hints:

Fix patch:
diff --git a/argh_derive/src/lib.rs b/argh_derive/src/lib.rs
index 8b3b7ee..db5cf9a 100644
--- a/argh_derive/src/lib.rs
+++ b/argh_derive/src/lib.rs
@@ -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.
@@ -188,7 +190,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
                 });


Test patch:
diff --git a/argh/tests/lib.rs b/argh/tests/lib.rs
index dbd3b48..78c6afa 100644
--- a/argh/tests/lib.rs
+++ b/argh/tests/lib.rs
@@ -317,6 +317,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)]