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

adante

A versatile, small options parser for use in the command line

1 unstable release

0.2.1 Jan 12, 2021

#28 in #user-defined

Custom license

20KB
211 lines

adante

Just a small arguments library for my rust applications.

I began copy and pasting so much that I just created this.


lib.rs:

adante

adante is a simple library that handles the logic of user defined types in order to provide efficiency in parsing command line arguments. At its core, adante simply provides an interface of which command line arguments can be transformed into a collection of three types.

  • Flags, which consist of:
    • A flag key
    • An optional String value
  • Actions
  • Errors

This is achieved by implementing a simple, but widely versatile set of tools laid out by the library. Here are the steps to making your first parser!

1. Define an enum consisting of all the errors your program might run into.

This can be seperate from your application's general Error enum if you have one, or it can be the same.

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

2. Imply the Error trait from the library.

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. Define an enum consisting of all of your flag and action keys.

enum FlagType {
    Help,
    Verbose,
    Print,
}

enum ActionType {
    Add,
    Remove,
    Edit,
}

4. Imply the ArgumentType trait from the library.

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),
        }
    }
}

And voila!

Now your parser is complete! By plugging std::env::args::collect() into Arguments::parse(), you will get a working Arguments object!

No runtime deps