Repository: google/argh (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
```

Pull request description:
Call unraw() on idents
This changes argh_derive to allow using raw struct field identifiers (e.g., `r#move`) as long names.

Closes #124

For the reference, other crates' derive macros, e.g., [serde](https://github.com/serde-rs/serde/issues/1362) and [clap](https://github.com/clap-rs/clap/blob/v4.4.18/tests/derive/raw_idents.rs) allow them.

Patch:
diff --git a/argh_derive/src/lib.rs b/argh_derive/src/lib.rs
index 4cbfcc3..4663935 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.
@@ -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
                 });


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