#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. Альтернативно, использование подкоманд вместо флагов может быть хорошей идеей.