标签: structopt

如何使用 StructOpt 将参数解析为 Vec 而不将其视为多个参数?

我有这个代码:

#[derive(StructOpt)]
pub struct Opt {
    /// Data stream to send to the device
    #[structopt(help = "Data to send", parse(try_from_str = "parse_hex"))]
    data: Vec<u8>,
}

fn parse_hex(s: &str) -> Result<u8, ParseIntError> {
    u8::from_str_radix(s, 16)
}
Run Code Online (Sandbox Code Playgroud)

这适用于myexe AA BB,但我需要将其myexe AABB作为输入。

有没有办法将自定义解析器传递structopt给解析AABBVec<u8>? 我只需要解析第二种形式(无空格)。

我知道我可以分两步完成(存储到String结构中的 a 然后解析它,但我喜欢我Opt的所有东西都有最终类型的想法。

我尝试了这样的解析器:

fn parse_hex_string(s: &str) -> Result<Vec<u8>, ParseIntError>
Run Code Online (Sandbox Code Playgroud)

StructOpt大约类型不匹配宏恐慌,因为它似乎产生Vec<Vec<u8>>

rust structopt

8
推荐指数
1
解决办法
1488
查看次数

如何使用 structopt 将 possible_values 附加到结构?

clappossible_values允许您使用这样的方式提供接受值的列表。

let mode_vals = ["fast", "slow"];
.possible_values(&mode_vals)
Run Code Online (Sandbox Code Playgroud)

如何做到这一点structopt

rust clap structopt

7
推荐指数
2
解决办法
2159
查看次数

如何根据structopt中另一个参数的存在使参数可选?

我有一个命令行工具,有两个可能的参数:

  • --version (将打印出版本号并退出)
  • --out (这是输入魔法的输出文件的路径).

如果用户通过--version我不关心,--out因为我打印版本,我已经完成,如果他们没有通过--version我想要--out被要求.

这就是我所拥有的,但我想知道是否有任何方法只使用structopt?

看起来我可能最终需要将所有参数都设为可选,并且自己进行所有验证......

#![feature(custom_attribute)]
#[macro_use]
extern crate structopt;

use structopt::StructOpt;
use std::path::PathBuf;

#[derive(Debug, StructOpt)]
#[structopt(name = "structopt_playing", about = "Just playing")]
struct Opt {
    #[structopt(short = "v", long = "version")]
    version: bool,

    #[structopt(short = "o", long = "out", parse(from_os_str))]
    output_file: Option<PathBuf>,
}

const VERSION: &'static str = env!("CARGO_PKG_VERSION");

fn main() {

    let opt = Opt::from_args();
    if opt.version {
        println!("Version: {}", VERSION);
        return;
    }

    if !opt.output_file.is_some() …
Run Code Online (Sandbox Code Playgroud)

rust structopt

4
推荐指数
1
解决办法
551
查看次数

如何将版本信息从 Vergen 传递到 StructOpt?

我正在尝试在 Rust 中设置一个简单的 CLI 程序,但我希望它根据其中的信息显示版本,git describe而不是 Cargo.toml 文件中的任何内容。

我设置了一些基本的依赖项:

[dependencies]
structopt = "0.3.13"

[build-dependencies]
vergen = "3.1.0"
Run Code Online (Sandbox Code Playgroud)

build.rs 文件使用 vergen 进行提升:

[dependencies]
structopt = "0.3.13"

[build-dependencies]
vergen = "3.1.0"
Run Code Online (Sandbox Code Playgroud)

结果是一组可从我的 main.rs 中使用的环境变量:

fn main() {
    println!("Build SHA: {}", env!("VERGEN_SHA_SHORT"));
}
Run Code Online (Sandbox Code Playgroud)

这会打印我构建的正确的 git SHA。问题是我不知道如何让 StruckOpt 使用生成的版本。我本来希望这样的事情能够发挥作用:

extern crate vergen;

use vergen::{ConstantsFlags, generate_cargo_keys};

fn main() {
    // Setup the flags, toggling off the 'SEMVER_FROM_CARGO_PKG' flag
    let mut flags = ConstantsFlags::all();
    flags.toggle(ConstantsFlags::SEMVER_FROM_CARGO_PKG);

    // Generate the 'cargo:' key output
    generate_cargo_keys(flags).expect("Unable to generate …
Run Code Online (Sandbox Code Playgroud)

command-line-interface rust structopt

3
推荐指数
1
解决办法
471
查看次数

如何在Rust中的structopt中使用枚举?

我想StructOpt使用枚举,这样每次用户传递-d sunday它时都会被解析为Day::Sunday:

#[macro_use]
extern crate structopt;

use std::path::PathBuf;
use structopt::StructOpt;

// My enum
enum Day {
    Sunday, Monday
}

#[derive(Debug, StructOpt)]
#[structopt(name = "example", about = "An example of StructOpt usage.")]
struct Opt {
    /// Set speed
    #[structopt(short = "s", long = "speed", default_value = "42")]
    speed: f64,
    /// Input file
    #[structopt(parse(from_os_str))]
    input: PathBuf,
    /// Day of the week
    #[structopt(short = "d", long = "day", default_value = Day::Monday)]
    day: Day,
}

fn main() { …
Run Code Online (Sandbox Code Playgroud)

enums command-line-arguments rust structopt

2
推荐指数
3
解决办法
576
查看次数