struargs 0.4.0

A macro that converts a structure into a Command parameter list
Documentation

struargs

A macro that builds a structure into a Command parameter list

Example

#[test]
fn test() {
    use struargs::Args;

    #[derive(Debug, Args)]
    struct StructArg {
        size: Option<i32>,
        name: Option<String>,
        #[args(rename = "type")]
        ty: Option<String>,
        #[args(no_value)]
        one: Option<()>,
        num: f32,
        #[args(short = "e")]
        enable: bool,
        a_b: bool,
    }

    let s = StructArg {
        size: None,
        name: Some("Ykong".to_string()),
        ty: Some("Arg".to_string()),
        one: Some(()),
        num: 100.1,
        enable: true,
        a_b: false,
    };

    let args = s.args().join(" ");

    assert_eq!(
        args,
        "--name Ykong --type Arg --one --num 100.1 -e true --a_b false"
    );

    let mut env_args = s
        .env_args()
        .into_iter()
        .map(|(k, v)| format!("{}={}", k, v))
        .collect::<Vec<_>>();

    env_args.sort();

    assert_eq!(
        env_args,
        vec![
            "A_B=false",
            "ENABLE=true",
            "NAME=Ykong",
            "NUM=100.1",
            "TYPE=Arg",
        ],
    );
}

it expand to (all field must impl Display)

    impl ::struargs::Args for StructArg {
        fn args(&self) -> Vec<String> {
            let mut args = ::alloc::vec::Vec::new();
            if let Some(ref value) = self.size {
                args.extend(["--size".to_string(), value.to_string()]);
            }
            if let Some(ref value) = self.name {
                args.extend(["--name".to_string(), value.to_string()]);
            }
            if let Some(ref value) = self.ty {
                args.extend(["--type".to_string(), value.to_string()]);
            }
            if self.one.is_some() {
                args.extend(["--one".to_string()]);
            }
            args.extend(["--num".to_string(), self.num.to_string()]);
            args.extend(["-e".to_string(), self.enable.to_string()]);
            args.extend(["--a_b".to_string(), self.a_b.to_string()]);
            args
        }
        fn env_args(&self) -> ::std::collections::HashMap<String, String> {
            let mut env_vars = ::std::collections::HashMap::new();
            if let Some(ref value) = self.size {
                env_vars.insert("SIZE".to_string(), value.to_string());
            }
            if let Some(ref value) = self.name {
                env_vars.insert("NAME".to_string(), value.to_string());
            }
            if let Some(ref value) = self.ty {
                env_vars.insert("TYPE".to_string(), value.to_string());
            }
            env_vars.insert("NUM".to_string(), self.num.to_string());
            env_vars.insert("ENABLE".to_string(), self.enable.to_string());
            env_vars.insert("A_B".to_string(), self.a_b.to_string());
            env_vars
        }
    }

Args

  • rename (custom)
  • no_value
  • short (custom)