#arguments-parser #arguments #parser #cli #command-line #user-defined

adante

一个适用于命令行的多功能、小型选项解析器

1 个不稳定版本

0.2.1 2021 年 1 月 12 日

#26#user-defined

自定义许可证

20KB
211 行代码(不包括注释)

adante

这只是我为我的 Rust 应用程序创建的一个小型参数库。

我开始粘贴太多,所以我就创建了它。


lib.rs:

adante

adante 是一个简单的库,用于处理用户定义类型,以便在解析命令行参数时提高效率。在核心上,adante 简单地提供了一个接口,通过该接口可以将命令行参数转换成三种类型。

  • 标志,包括
    • 标志键
    • 可选的 String
  • 动作
  • 错误

这是通过实现库中提供的一系列简单但多功能工具来实现的。以下是创建第一个解析器的步骤!

1. 定义一个枚举,其中包含程序可能遇到的所有错误。

这可以与您应用程序的一般 Error 枚举分开,如果您有一个的话,或者它可以相同。

#[derive(Debug, Clone, Copy)] // Highly advised
pub enum ErrorType {
    Syntax,
    InvalidAction,
    InvalidFlag,
    NoFlagVal,
}

2. 引入库中的 Error 特征。

use adante::Error;
#[derive(Debug, Clone, Copy)] // Highly advised
pub enum ErrorType {
    Syntax,
    InvalidAction,
    InvalidFlag,
    NoFlagVal,
}
impl Error for ErrorType {
    fn handle(&self) {
        println!("{}", self.as_str());
        std::process::exit(1);
    }
    fn as_str(&self) -> &str {
        match self {
            Self::Syntax => "Improper syntax usage.",
            Self::InvalidAction => "One or more of your actions entered is invalid.",
            Self::InvalidFlag => "One or more of your flags entered is invalid",
            Self::NoFlagVal => "One or more of your flags is missing a field",
        }
    }
}

3. 定义一个枚举,其中包含所有标志和动作键。

enum FlagType {
    Help,
    Verbose,
    Print,
}

enum ActionType {
    Add,
    Remove,
    Edit,
}

4. 引入库中的 ArgumentType 特征。

use adante::ArgumentType;
enum FlagType {
    Help,
    Verbose,
    Print,
}
impl ArgumentType for FlagType {
    fn from_str<ErrorType>(key: &str, error: ErrorType)
        -> Result<Self, ErrorType> {
        match key {
            "-h" | "--help" => Ok(Self::Help),
            "-v" | "--verbose" => Ok(Self::Verbose),
            "-p" | "--print" => Ok(Self::Print),
            _ => Err(error),
        }
    }
}

enum ActionType {
    Add,
    Remove,
    Edit,
}
impl ArgumentType for ActionType {
    fn from_str<ErrorType>(key: &str, error: ErrorType)
        -> Result<Self, ErrorType> {
        match key {
            "a" | "add" => Ok(Self::Add),
            "r" | "remove" => Ok(Self::Remove),
            "e" | "edit" => Ok(Self::Edit),
            _ => Err(error),
        }
    }
}

就这样!

现在您的解析器就完成了!通过将 std::env::args::collect() 插入到 Arguments::parse() 中,您将获得一个可工作的 Arguments 对象!

无运行时依赖