TeXitoi / structopt

Parse command line arguments by defining a struct.
Other
2.71k stars 150 forks source link

Unexpected behavior combining `AppSettings::TrailingVarArg` and `env` fallbacks #487

Closed eadwu closed 3 years ago

eadwu commented 3 years ago
use structopt::{clap::AppSettings, StructOpt};

#[derive(StructOpt, Debug)]
#[structopt(
    setting = AppSettings::TrailingVarArg,
)]
struct Arguments {
    #[structopt(env = "SHELL", raw(true), multiple(true), use_delimiter(false))]
    cmd: Vec<String>,
}

pub fn main() {
    let args = Arguments::from_args();

    println!("{:?}", args);
}

Using an env fallback seems to be confusing the collection of the arguments.

Current Behavior:

❯  result/bin/binary --
Arguments { cmd: ["/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh"] }
❯  result/bin/binary -- $SHELL
Arguments { cmd: ["/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh", "/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh"] }
❯  result/bin/binary -- $SHELL -i
Arguments { cmd: ["/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh", "-i", "/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh"] }
❯  result/bin/binary -- -i
Arguments { cmd: ["-i", "/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh"] }
❯  result/bin/binary -- -i $SHELL
Arguments { cmd: ["-i", "/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh", "/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh"] }

Expected Behavior:

❯  result/bin/binary --
Arguments { cmd: ["/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh"] }
❯  result/bin/binary -- $SHELL
Arguments { cmd: ["/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh"] }
❯  result/bin/binary -- $SHELL -i
Arguments { cmd: ["/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh", "-i"] }
❯  result/bin/binary -- -i
Arguments { cmd: ["-i"] }
❯  result/bin/binary -- -i $SHELL
Arguments { cmd: ["-i", "/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh"] }
TeXitoi commented 3 years ago

This should be a clap issue, in this case, structopt just delegate everything to clap.

eadwu commented 3 years ago

default_value work as intended though

❯  result/bin/binary --
Arguments { cmd: ["SHELL"] }
❯  result/bin/binary -- $SHELL
Arguments { cmd: ["/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh"] }
❯  result/bin/binary -- $SHELL -i
Arguments { cmd: ["/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh", "-i"] }
❯  result/bin/binary -- -i
Arguments { cmd: ["-i"] }
❯  result/bin/binary -- -i $SHELL
Arguments { cmd: ["-i", "/nix/store/pfk6bllfmp7k939wwd6l3iycb500mvz2-zsh-5.8/bin/zsh"] }
TeXitoi commented 3 years ago

As it's a won't fix in clap v2 as it's fixed in clap v3, I close this.