kal 0.5.0

Command Abstraction Layer
Documentation
use crate::{
    CommaSeparated, CommandArgumentValue, SpaceSeparated, TryFromArgumentValue,
    TryFromArgumentValueError,
};

macro_rules! try_into_vec {
    ($value:expr, $strict:expr, $($split:tt)*) => {
        match $value {
            CommandArgumentValue::String(inner) => inner
                .$($split)*
                .map(|s| T::try_from_argument_value(CommandArgumentValue::String(s.trim().to_string()), false))
                .collect::<Result<_, _>>(),
            value => Ok(vec![T::try_from_argument_value(value, $strict)?]),
        }
    };
}

impl<T: TryFromArgumentValue> TryFromArgumentValue for SpaceSeparated<T> {
    fn try_from_argument_value(
        value: CommandArgumentValue,
        strict: bool,
    ) -> Result<Self, TryFromArgumentValueError> {
        try_into_vec! {
            value,
            strict,
            split_ascii_whitespace()
        }
        .map(SpaceSeparated)
    }
}
impl<T: TryFromArgumentValue> TryFromArgumentValue for CommaSeparated<T> {
    fn try_from_argument_value(
        value: CommandArgumentValue,
        strict: bool,
    ) -> Result<Self, TryFromArgumentValueError> {
        try_into_vec! {
            value,
            strict,
            split(',')
        }
        .map(CommaSeparated)
    }
}