Crate cmdexpand

Source
Expand description

This library performs batch-like expansions in strings, that is, to expand %VAR% into their values inside some context. It’s like a Windows version of shellexpand.

Aside from context variables, it can also expands number arguments (e.g %1, %*) syntax with a list of arguments provided by user.

Unlike shellexpand, variables that do not exist will expand to empty string.

§Usage

See example below on how to define a context. The library also provids a default cmdexpand::env_context which can expand environment variable.

use cmdexpand::Expander;

fn mycontext(s: &str) -> Option<String> {
   match s {
       "NAME" => Some(String::from("Alice")),
       "HOBBY" => Some(String::from("coding")),
       _ => None,
   }
}

assert_eq!(Expander::new(r#"echo "%NAME%'s hobby is %HOBBY%""#)
              .add_context(&mycontext)
              .expand()
              .unwrap(),
           r#"echo "Alice's hobby is coding""#);

You can provide a list of arguments too.

use cmdexpand::Expander;

// arguments start from 1. `%0` will always expand to empty string
assert_eq!(Expander::new("del %1")
            .add_args(&["a.txt", "b.txt"])
            .expand()
            .unwrap(), "del a.txt");

// `%*` behaves like `$*` on Linux
assert_eq!(Expander::new("del %*")
            .add_args(&["a.txt", "b.txt"])
            .expand()
            .unwrap(), r#"del "a.txt b.txt""#);

// `%@` behaves like `$@` on Linux, even though technically there's no `%@` on Windows
assert_eq!(Expander::new("del %@")
            .add_args(&["a.txt", "b.txt"])
            .expand()
            .unwrap(), r#"del a.txt b.txt"#);

Structs§

Expander
Configuration for expanding command

Enums§

CmdExpandError

Functions§

env_context
Context that contains environment variables

Type Aliases§

Context