3个版本 (破坏性更新)

0.3.0 2022年12月29日
0.2.0 2022年9月7日
0.1.0 2022年8月26日

#1559 in 加密学

每月 37次下载

MIT/Apache

30KB
448

clap-digest

在CLI上集成选择digestclap

功能

  1. 对不同的摘要算法类型实现clap::ValueEnum

    use clap::builder::{Arg, ArgAction, EnumValueParser};
    use clap_digest::Digest;
    
    Arg::new("digest")
        .action(ArgAction::Set)
        .value_parser(EnumValueParser::<Digest>::new())
    
  2. 现成的clap::Arg实现

    use clap::{Command, ValueEnum};
    use clap_digest::{Digest, DynDigest};
    
    let cli = Command::new("myapp")
        .arg(clap_digest::arg::digest().required_unless_present("list-digests"))
        .arg(clap_digest::arg::list_digests());
    
    let args = cli.get_matches_from(["myapp", "--list-digests"]);
    
    if args.get_flag("list-digests") {
        for digest in Digest::value_variants() {
            println!("{digest}");
        }
    } else {
        let digest = *args
            .get_one::<Digest>("digest")
            .expect("has default via clap");
    
        todo!()
    }
    

    有关更多信息,请参阅clap_digest::arg模块。

  3. clap_digest::Digestdigest::DynDigest的转换

    use clap_digest::{Digest, DynDigest};
    
    // fn doing some hashing, using any DynDigest implementation
    fn dyn_hash(hasher: &mut dyn DynDigest, data: &[u8]) -> String {
        hasher.update(data);
        let hash = hasher.finalize_reset();
        hash.iter().map(|byte| format!("{:02x}", byte)).collect()
    }
    
    // parse user-supplied CLI input to clap_digest::Digest with clap
    // suppose user runs this with: `command --digest MD5`
    // let args = cli.get_matches();
    let digest = *args.get_one::<Digest>("digest").unwrap();
    
    // convert to DynDigest
    let mut digest: Box<dyn DynDigest> = digest.into();
    
    // use with hashing function
    let hash = dyn_hash(digest.as_mut(), b"foo");
    
    assert_eq!(hash, "acbd18db4cc2f85cedef654fccc4a4d8");
    
  4. 摘要算法组是功能控制的。使用cargo feature clap-digest获取完整列表。至少选择一个摘要算法组功能。要限制您在crate中想要支持的摘要算法家族,请定义您自己的功能,例如

    [features]
    default = ["sha2"]
    md5 = ["clap-digest/md5"]
    sha1 = ["clap-digest/sha1"]
    sha2 = ["clap-digest/sha2"]
    

示例

有关完整的CLI示例,请参阅examples/cksum.rs

$ cargo run --example cksum -- -d SHA1 Cargo.toml
7a96ee85606435fe1f39c3fa6bdf4cf9bbbc338c  Cargo.toml

$ sha1sum Cargo.toml
7a96ee85606435fe1f39c3fa6bdf4cf9bbbc338c  Cargo.toml

$ cargo run --example cksum -- -d MD5 Cargo.toml | md5sum -c
Cargo.toml: OK

列出所有支持的算法

$ cargo run --example cksum -- --list-digests
BLAKE2b512
BLAKE2s256
BLAKE3
...

所有算法组都是功能控制的,因此您可以选择

$ cargo run --example cksum --no-default-features --features md5,sha1,sha2 -- --list-digests
MD5
SHA1
SHA224
SHA256
SHA384
SHA512
SHA512/224
SHA512/256

依赖关系

~5MB
~82K SLoC