#clap #deserializable #deser #flags #serde #stdin #ability

clap-maybe-deser

添加将可反序列化数据用作clap参数的功能

3个不稳定版本

0.2.0 2024年6月28日
0.1.1 2024年6月27日
0.1.0 2024年6月27日

#424 in 编码

Download history 350/week @ 2024-06-25 38/week @ 2024-07-02

每月388次下载

MIT/Apache

165KB
299

clap-maybe-deser

提供包装类型,允许

  • 通过Deser类型将serde可反序列化对象解析为标志。
  • 您还可以使用MaybeDeser类型,让您的应用程序解析标志或可反序列化对象。
  • 通过MaybeStdinDeser类型,您可以执行上述操作,但可反序列化对象可以来自stdin,通过clap-stdin软件包。
  • 还公开了CustomDeserializer特质,以便您可以使用自己的Deserialize类型进行实现。

Crates.io API Reference

用法

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);
}

帮助输出如下:Json 配置帮助示例

CLI的用法如下:Json 配置使用示例

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);
}

帮助输出如下:Mayble Json 配置帮助示例

传递json的用法如下:Maybe Json 配置 Json 使用示例

传递标志的用法如下:Maybe 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。
  • MaybeDeserMaybeStdinDeser 动态命名标志。
  • 通过 clap-stdinFileOrStdin 添加从文件读取的支持。

许可协议

此项目受 MIT 许可证和 Apache 2.0 许可证的共同许可。有关详细信息,请参阅 LICENSE-MIT 和 LICENSE-APACHE 文件。

此项目包括受宽松许可协议许可的依赖项

依赖项

~1–1.5MB
~26K SLoC