3个不稳定版本
0.2.0 | 2024年6月28日 |
---|---|
0.1.1 | 2024年6月27日 |
0.1.0 | 2024年6月27日 |
#424 in 编码
每月388次下载
165KB
299 行
clap-maybe-deser
提供包装类型,允许
- 通过
Deser
类型将serde
可反序列化对象解析为标志。 - 您还可以使用
MaybeDeser
类型,让您的应用程序解析标志或可反序列化对象。 - 通过
MaybeStdinDeser
类型,您可以执行上述操作,但可反序列化对象可以来自stdin
,通过clap-stdin
软件包。 - 还公开了
CustomDeserializer
特质,以便您可以使用自己的Deserialize
类型进行实现。
用法
Deser
将serde可反序列化对象解析为标志
// You can run this example with: ` cargo run --features serde_json --example json_config --`
use clap::Parser;
use clap_maybe_deser::{Deser, JsonDeserializer};
use serde::Deserialize;
#[derive(Deserialize, Debug, Clone)]
struct Config {
key: String,
value: String,
}
#[derive(Parser, Debug)]
struct Cli {
#[clap(long, short)]
config: Deser<Config, JsonDeserializer>,
}
fn main() {
let args = Cli::parse();
println!("key: {}", args.config.data.key);
println!("value: {}", args.config.data.value);
}
帮助输出如下:
CLI的用法如下:
MaybeDeser
解析为标志或可反序列化的字符串
// You can run this example with: ` cargo run --features serde_json --example maybe_json_config --`
use clap::{Args, Parser};
use clap_maybe_deser::{JsonDeserializer, MaybeDeser};
use serde::Deserialize;
#[derive(Args, Deserialize, Debug, Clone)]
struct Config {
#[clap(long, short)]
key: String,
#[clap(long, short)]
value: String,
}
#[derive(Parser, Debug)]
struct Cli {
#[clap(flatten)]
config: MaybeDeser<Config, JsonDeserializer>,
}
fn main() {
let args = Cli::parse();
println!("key: {}", args.config.data.key);
println!("value: {}", args.config.data.value);
}
帮助输出如下:
传递json的用法如下:
传递标志的用法如下:
MaybeStdinDeser
将来自stdin的可反序列化字符串解析为标志,作为可反序列化字符串或标志
// You can run this example with: `cargo run --features serde_json,stdin --example maybe_stdin_json_config --`
use clap::{Args, Parser};
use clap_maybe_deser::{JsonDeserializer, MaybeStdinDeser};
use serde::Deserialize;
#[derive(Args, Deserialize, Debug, Clone)]
struct Config {
#[clap(long, short)]
key: String,
#[clap(long, short)]
value: String,
}
#[derive(Parser, Debug)]
struct Cli {
#[clap(flatten)]
config: MaybeStdinDeser<Config, JsonDeserializer>,
}
fn main() {
let args = Cli::parse();
println!("key: {}", args.config.data.key);
println!("value: {}", args.config.data.value);
}
输出和使用方法与 MaybeDeser
完全相同,但现在您也可以通过 stdin
传递 JSON
:![Maybe Json Config Json Stdin Use Example](https://img.gs/czjpqfbdkz/800/https://raw.githubusercontent.com/gluax/clap-maybe-deser/27c7a502b7d829aa193f7d253ce6415a0472f134/screenshots/maybe_stdin_json_config.png) ![Maybe Json Config Json Stdin Use Example](https://img.gs/czjpqfbdkz/800,2x/https://raw.githubusercontent.com/gluax/clap-maybe-deser/27c7a502b7d829aa193f7d253ce6415a0472f134/screenshots/maybe_stdin_json_config.png 2x) 宽度:800 高度:82
自定义实现
为了支持您想要的任何 Deserialize 兼容实现,您可以这样做:
// You can run this example with: `cargo run --example custom_yaml_config --`
use clap::Parser;
use clap_maybe_deser::{CustomDeserializer, Deser};
use serde::{de::DeserializeOwned, Deserialize};
#[derive(Debug, Clone)]
struct YamlDeserializer;
impl CustomDeserializer for YamlDeserializer {
type Error = serde_yml::Error;
const NAME: &'static str = "yaml";
fn from_str<Data: DeserializeOwned>(s: &str) -> Result<Data, Self::Error> {
serde_yml::from_str(s)
}
}
#[derive(Deserialize, Debug, Clone)]
struct Config {
key: String,
value: String,
}
#[derive(Parser, Debug)]
struct Cli {
#[clap(long, short)]
config: Deser<Config, YamlDeserializer>,
}
fn main() {
let args = Cli::parse();
println!("key: {}", args.config.data.key);
println!("value: {}", args.config.data.value);
}
您也可以看到这个功能的效果:![Custom Yaml Config Use Example](https://img.gs/czjpqfbdkz/full/https://raw.githubusercontent.com/gluax/clap-maybe-deser/27c7a502b7d829aa193f7d253ce6415a0472f134/screenshots/custom_yaml_config.png) 宽度:618 高度:154
待办事项
- 直接支持更多的 serde crate。
- 为
MaybeDeser
和MaybeStdinDeser
动态命名标志。 - 通过
clap-stdin
的FileOrStdin
添加从文件读取的支持。
许可协议
此项目受 MIT 许可证和 Apache 2.0 许可证的共同许可。有关详细信息,请参阅 LICENSE-MIT 和 LICENSE-APACHE 文件。
此项目包括受宽松许可协议许可的依赖项
clap
: MIT 许可证或 Apache 2.0 许可证clap-stdin
: MIT 许可证或 Apache 2.0 许可证serde
: MIT 许可证或 Apache 2.0 许可证serde_json
: MIT 许可证或 Apache 2.0 许可证
依赖项
~1–1.5MB
~26K SLoC