kurisu 0.1.6

Small idiomatic command line options parser
Documentation
pub const VALUE_SEPARATOR: &str = "(_(__)===D";

#[cfg(feature = "parser_extras")]
mod extras;
#[cfg(feature = "parser_extras")]
pub use extras::*;
use std::path::PathBuf;

pub trait Parser {
    fn parse(value: &str) -> Self;
}

impl Parser for String {
    fn parse(value: &str) -> Self {
        value.replace(VALUE_SEPARATOR, " ")
    }
}

impl Parser for Vec<String> {
    fn parse(value: &str) -> Self {
        if value.is_empty() {
            return Vec::new();
        }

        value.split(VALUE_SEPARATOR).map(|v| v.to_string()).collect()
    }
}

impl Parser for bool {
    fn parse(value: &str) -> Self {
        value.parse::<bool>().unwrap_or_default()
    }
}

impl Parser for u8 {
    fn parse(value: &str) -> Self {
        value.parse::<u8>().unwrap_or_default()
    }
}

impl Parser for usize {
    fn parse(value: &str) -> Self {
        value.parse::<usize>().unwrap_or_default()
    }
}

impl Parser for Vec<usize> {
    fn parse(value: &str) -> Self {
        if value.is_empty() {
            return Vec::new();
        }

        value.split(VALUE_SEPARATOR).map(|v| v.parse::<usize>().unwrap_or_default()).collect()
    }
}

impl Parser for isize {
    fn parse(value: &str) -> Self {
        value.parse::<isize>().unwrap_or_default()
    }
}

impl Parser for Vec<isize> {
    fn parse(value: &str) -> Self {
        if value.is_empty() {
            return Vec::new();
        }

        value.split(VALUE_SEPARATOR).map(|v| v.parse::<isize>().unwrap_or_default()).collect()
    }
}

impl Parser for f64 {
    fn parse(value: &str) -> Self {
        value.parse::<f64>().unwrap_or_default()
    }
}

impl Parser for Vec<f64> {
    fn parse(value: &str) -> Self {
        if value.is_empty() {
            return Vec::new();
        }

        value.split(VALUE_SEPARATOR).map(|v| v.parse::<f64>().unwrap_or_default()).collect()
    }
}

impl Parser for PathBuf {
    fn parse(value: &str) -> Self {
        if value.is_empty() {
            return PathBuf::default();
        }

        PathBuf::from(value)
    }
}

impl Parser for Vec<PathBuf> {
    fn parse(value: &str) -> Self {
        if value.is_empty() {
            return Vec::new();
        }

        value
            .split(VALUE_SEPARATOR)
            .map(|v| {
                if v.is_empty() {
                    return PathBuf::default();
                }

                PathBuf::from(v)
            })
            .collect()
    }
}