argust 0.0.3

Simple to use commandline parser for rust programs
Documentation
use std::collections::{HashMap, HashSet};

use crate::utils::new_string;

#[derive(Debug, Clone)]
pub struct ArgContext {
    pub long_params: HashMap<String, Option<String>>,
    pub short_params: HashMap<String, Option<String>>,
    pub args: Vec<String>,
}

#[derive(Debug, Clone)]
pub struct ParseTokens {
    pub long_token: String,
    pub option_key: String,
    pub short_token: String,
}

#[derive(Debug, Clone)]
pub struct ParserConfig {
    pub parse_tokens: ParseTokens,
    pub parameterized_long_params: HashSet<String>,
    pub parameterized_short_params: HashSet<String>,
}

impl ParseTokens {
    pub fn new() -> ParseTokens {
        ParseTokens {
            long_token: new_string!("--"),
            option_key: new_string!("="),
            short_token: new_string!("-"),
        }
    }
}

impl ParserConfig {
    pub fn new() -> ParserConfig {
        ParserConfig {
            parse_tokens: ParseTokens::new(),
            parameterized_short_params: HashSet::new(),
            parameterized_long_params: HashSet::new(),
        }
    }

    pub fn get_parse_config(parse_config: Option<ParserConfig>) -> ParserConfig {
        parse_config.or_else(|| Some(ParserConfig::new())).unwrap()
    }

    pub fn add_parameter(&mut self, short: char, long: &str) {
        self.parameterized_short_params.insert(short.to_string());
        self.parameterized_long_params.insert(long.to_string());
    }
}

impl ArgContext {
    pub fn contains_short(&self, short: char) -> (bool, Option<String>) {
        return self.contains(Some(short), None);
    }
    pub fn contains_long(&self, long: &str) -> (bool, Option<String>) {
        return self.contains(None, Some(long));
    }
    pub fn contains(&self, short: Option<char>, long: Option<&str>) -> (bool, Option<String>) {
        if let Some(short) = short {
            return self.check_value(&short.to_string(), &self.short_params);
        }
        if let Some(long) = long {
            return self.check_value(long, &self.long_params);
        }
        return (false, None);
    }

    fn check_value(
        &self,
        key: &str,
        list: &HashMap<String, Option<String>>,
    ) -> (bool, Option<String>) {
        let key = list.get(key);
        match key {
            Some(value) => return (true, value.to_owned()),
            None => return (false, None),
        };
    }
}