我有这个代码:
#[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给解析AABB为Vec<u8>? 我只需要解析第二种形式(无空格)。
我知道我可以分两步完成(存储到String结构中的 a 然后解析它,但我喜欢我Opt的所有东西都有最终类型的想法。
我尝试了这样的解析器:
fn parse_hex_string(s: &str) -> Result<Vec<u8>, ParseIntError>
Run Code Online (Sandbox Code Playgroud)
在StructOpt大约类型不匹配宏恐慌,因为它似乎产生Vec<Vec<u8>>。
clappossible_values允许您使用这样的方式提供接受值的列表。
let mode_vals = ["fast", "slow"];
.possible_values(&mode_vals)
Run Code Online (Sandbox Code Playgroud)
如何做到这一点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 中设置一个简单的 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) 我想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)