如何使用 Clap Args 的内部库 Enum

2024-03-28

我目前正在研究一个铁锈端口 https://github.com/JuxhinDB/twistrs某证券的tool https://github.com/elceef/dnstwist。与 Rust 的指南一致,我想将核心库隔离到自己的包中,以便我们可以创建与核心库交互的各种工具(CLI、API、流等),而无需将它们耦合在一起。

核心库公开了两个公共枚举,其中之一是PermutationMode(截断):

#[derive(Debug, Copy, Clone, PartialEq)]
pub enum PermutationMode {
    All,
    Addition,
    BitSquatting,
    Homoglyph,
}

使用创建 CLI 实用程序时Clap https://github.com/clap-rs/clap,我想扩展这个库 Enum 作为 CLI 的一部分,如下所示:

use clap::Clap;

use twistrs::permutate::PermutationMode;

#[derive(Clap, PartialEq, Debug)]
#[clap(name = "twistrs-cli")]
struct Opts {
    #[clap(short, long)]
    registered_domains: bool,

    #[clap(arg_enum)]
    permutation_mode: PermutationMode,
}

这样,在调用 CLI 时,我们可以将排列模式从用户无缝传递到 CLI、库,并且 CLI 无需了解内部模式(如果库添加了更多模式)。

./twist-cli --registered-domains --permutation_mode=all example.com

目前这似乎不可能(这是有道理的)。一种尝试是使用类型别名:

#[derive(Clap)]
type ArgPermutationMode = PermutationMode

但是,我们不能将派生宏用于类型别名。我还尝试“克隆”枚举并尝试映射到库枚举:

enum ArgPermutationMode {
    PermutationMode::All,
}

哪个不编译。


Question- 是否可以扩展内部库枚举以将其用作 Clap 参数?


这更多的是对上述答案的扩展,以防它可能对其他人有所帮助。最终我最终选择的是实施实施FromStr https://github.com/JuxhinDB/twistrs/blob/master/twistrs/src/permutate.rs#L37-L60在库中如下:

impl FromStr for PermutationMode {
    type Err = Error;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s.to_ascii_lowercase().as_str() {
            "all" => Ok(PermutationMode::All),
            "addition" => Ok(PermutationMode::Addition),
            "bitsquatting" => Ok(PermutationMode::BitSquatting),
            "homoglyph" => Ok(PermutationMode::Homoglyph),
            _ => Err(),
        }
    }
}

为了避免让客户担心这些模式,我们只是尝试解析字符串 https://github.com/JuxhinDB/twistrs/blob/master/examples/twistr-cli/src/main.rs#L38-L42通过 CLI 进入其中一种排列模式。

let permutation_mode = matches
    .value_of("permutation_mode")
    .unwrap()
    .parse::<PermutationMode>()
    .unwrap();

这样我们就不需要耦合客户端和库之间的模式,总体上使示例 CLI 更具可塑性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Clap Args 的内部库 Enum 的相关文章

随机推荐

  • Python 的 difflib SequenceMatcher 加速

    我使用 difflib SequenceMatcher ratio 方法 来定义文本文件之间的相似性 虽然 difflib 比较一小组文本文件的速度相对较快 例如10 个 70 kb 的文件平均相互比较 46 次比较 大约需要 80 秒 这
  • Hive 左外连接长期运行

    Hortonworks HDP 2 3 0 Hive 0 14 Table T1 partition on col1 no bucket ORC 应用程序 1 2 亿行和 6GB 数据大小Table T2 partition on col2
  • 在 awk match 函数的字符串参数中使用特殊字符。当前区域设置

    我在使用时遇到问题match函数于awk在包含特殊字符的字符串上 考虑文件test awk match 0 kon a print a 1 以及相应的测试文件 test txt 其内容为 Testing H kon 注意挪威语字符 该文件采
  • mysql 复制 - 一个数据库上的从服务器

    我找不到我的问题的答案 我有 2 台 mysql 服务器 主服务器 从服务器 现在我想添加另一个从服务器 但我有其他网站在该服务器上运行 我可以只复制一个数据库吗 是的你可以 如果你只想从master复制一个数据库 你可以设置replica
  • 如何将这些邮政编码导入到标准化表中?

    我有一个 CSV 其中包含一些数据 如下所示 A0A0A0 48 5674500000 54 8432250000 Gander NL A0A1A0 47 0073470000 52 9589210000 Aquaforte NL A0A1
  • Mac OSX 上 IntelliJ Idea 中区分大小写的文件

    我的java项目有名称相同但大小写不同的文件 Test java test java 我在 Mac 上设置了区分大小写的文件系统 并且能够通过 CLI 查看 编辑它们 但是 Intellij Idea 并不认为它们不同 编译失败 如何修复
  • 如何使用 SuperObject 序列化包含点(例如 IP 地址)的 JSON 密钥?

    我正在尝试保存 JSON 其中 IP 是关键 预期的 JSON 结果是 SnmpManagers 10 112 25 235 162 Delphi超级对象代码 const IpAddr 10 112 25 235 Port 162 var
  • 删除字符串时堆损坏

    这是我的代码 std string readString int strLen Read
  • 使用 Gradle 运行多个 Spring Boot 微服务

    我正在开发一个使用 Gradle 构建的 Spring Boot 应用程序 我们有多个微服务作为该应用程序的子项目 我正在尝试使用 Spring Boot 的 bootRun 任务从命令行使用单个 bootRun 命令运行应用程序和所有微服
  • Android 模拟器停止显示屏幕键盘?

    我在 eclipse 中使用 AVD 管理器 是否有一个设置可以用来在输入字段获得焦点时停止显示屏幕键盘 我尝试了硬件键盘 true 但模拟器似乎根本没有启动 S 姆斯托伊克的回答 https stackoverflow com a 541
  • 如何调试CompletableStage死锁?

    我最近遇到的最困难的调试问题是异步操作之间的死锁 例如 给定两个CompletionStage链 其中第一个链调用依赖于第二个链的完成的方法 第二个链调用依赖于第一个链的完成的方法 这在现实生活中并不那么明显 因为依赖关系往往是隐藏的 有时
  • OTRS:使用 wsdl 生成 Java SEI 时出错

    Windows 7 Java 7 OTRS appliannce 我正在尝试使用 wsimport 来生成带有 wsdl 文件的 Java SEIhttps raw githubusercontent com OTRS otrs maste
  • C 中 (*p)[8] 和 *p[8] 有什么区别?

    两个声明如下 int p 8 int p 8 第一个是single指向 8 个整数的数组的指针 而第二个是array8 个指针 每个指针指向一个整数 如果你只是踢起来cdecl 对于这类事情来说非常棒 pax cdecl Type help
  • 如何使用 laravel-mix 将 mdbootstrap vue 加载到 Laravel 5 中?

    我正在尝试将 mdbootstrap vue 安装到 Laravel 5 6 项目中 但我真的不明白我该怎么做 如果有人能给我一些教程 那就太好了 试试这个 已更新 假设你已经安装了laravel 转到您的项目目录并执行以下操作 npm i
  • 删除 Ember 数据中 POST/PUT 操作的 JSON 根元素

    我正在使用一个 Web 服务 该服务在 POST PUT 动词中需要如下所示的 JSON id CACTU companyName Cactus Comidas para llevar contactName Patricio Simpso
  • 字典中的差异

    我试图找出字典中的差异 是否添加或删除了某些内容以及从什么内容中添加或删除了某些内容 这是一个添加值的情况 original 0 None 1 False 2 16 new 0 None 1 False 2 2 16 difference
  • 从构建中获取 BuildAgent 信息

    我有一个 IBuildDetail 变量 其中包含我需要的构建信息 好的 但是当我检查属性 BuildAgent 时 它显示 build BuildAgent 抛出了类型为 System NotImplementedException 的异
  • Windows CMD 中的创建日期

    使用 Windows 批处理 此函数返回文件的创建日期 creationDate set CompareFile 1 echo CompareFile for f skip 5 tokens 1 2 4 5 delims a in dir
  • 如何获取内存中对象的数据集?

    有谁知道与泛型和 RTTI 一起使用的 TDataset 后代 以便我可以编写这样的代码 并在 GUI 中使用数据感知组件 ds TDataset
  • 如何使用 Clap Args 的内部库 Enum

    我目前正在研究一个铁锈端口 https github com JuxhinDB twistrs某证券的tool https github com elceef dnstwist 与 Rust 的指南一致 我想将核心库隔离到自己的包中 以便我