我目前正在开发一个安全工具的Rust 端口。根据 Rust 的指南,我想将核心库分离到它自己的 crate 中,这样我们就可以创建与核心库交互的各种工具(CLI、API、流等),而无需将它们耦合在一起。
核心库公开了两个公共枚举,其中一个是PermutationMode
(截断的):
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum PermutationMode {
All,
Addition,
BitSquatting,
Homoglyph,
}
使用Clap创建 CLI 实用程序时,我想将此库 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,
}
哪个不编译。
问题- 是否可以扩展内部库 Enum 以将其用作 Clap 参数?