В настоящее время я работаю над портом Rust инструмента безопасности . В соответствии с руководствами Rust, я хочу выделить базовую библиотеку в отдельный ящик, чтобы мы могли создавать различные инструменты (CLI, API, потоки и т. Д. c.), Которые взаимодействуют с основной библиотекой, не связывая их вместе.
Базовая библиотека предоставляет два publi c Enum, одно из которых - PermutationMode
(усеченное):
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum PermutationMode {
All,
Addition,
BitSquatting,
Homoglyph,
}
При создании утилиты CLI с использованием 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,
}
Что не компилируется.
Вопрос - Можно ли расширить внутреннюю библиотеку Enum, чтобы использовать ее в качестве аргумента Clap?