structops — как сделать аргумент необязательным на основе логического флага

#rust #clap #structopt

#Ржавчина #хлоп #structopt

Вопрос:

У меня есть программа, которая принимает 2 логических флага -d для декодирования и -e для кодирования. Однако, если -e указано, необходимо предоставить дополнительную строку сообщения (сообщение для кодирования). Эта строка не должна присутствовать, если -d указана. Как я могу сделать это с помощью structops?

Вот что я пробовал:

 #[derive(Debug, StructOpt)]
#[structopt(name="encode_test", about="encodes messages")]
struct Opt {
    #[structopt(short="e", long="encode")]
    encode: bool,

    #[structopt(requires("encode"))]
    message: String,

    #[structopt(short="d", long="decode")]
    decode: bool,
}
  

запуск программы с использованием cargo run -- -e "test message" работает нормально, но cargo run -- -d выдает ошибку, что <message> --encode аргументы and не были предоставлены.

Как я могу требовать <message> , только если -e присутствует?

Я также попробовал следующее:

 #[derive(Debug, StructOpt)]
#[structopt(name="encode_test", about="encodes messages")]
struct Opt {
    #[structopt(short="d", long="decode", required_unless("encode"))]
    decode: bool,

    // I've tried using conflicts_with("decode") here as well, same panic
    #[structopt(short="e", long="encode", required_unless("decode"))]
    encode: String, //does not panic if I change type here from string to bool
}
  

Который, опять же, работает -e message , но паникует при указании только -d параметра

Комментарии:

1. Вы пробовали использовать Option<String> для аргумента encode?

2. @Jmb это решило проблему. Спасибо

3. Альтернативно, использование подкоманд вместо флагов может быть хорошей идеей.