parkour 0.1.0

A fast, extensible command-line arguments parser
Documentation
use crate::{Error, ErrorInner, FromInputValue};

#[derive(Debug)]
pub struct TupleCtx<C> {
    pub delimiter: char,
    pub inner: C,
}

impl<C> TupleCtx<C> {
    pub fn new(delimiter: char, inner: C) -> Self {
        Self { delimiter, inner }
    }
}

impl<C: Default> Default for TupleCtx<C> {
    fn default() -> Self {
        TupleCtx { delimiter: ',', inner: C::default() }
    }
}

macro_rules! impl_tuple {
    ($( $t:ident $v:ident $i:tt ),* $(,)?) => {
        impl<$( $t: FromInputValue ),*> FromInputValue for ($( $t ),* ,) {
            type Context = TupleCtx<($( $t::Context ),* ,)>;

            fn from_input_value(value: &str, context: &Self::Context) -> Result<Self, Error> {
                let mut iter = value.split(context.delimiter);

                $(
                    let $v = $t::from_input_value(
                        iter.next().ok_or_else(|| ErrorInner::IncompleteValue($i + 1))?,
                        &context.inner.$i,
                    )?;
                )*

                Ok(($( $v ),* ,))
            }
        }
    };
}

impl_tuple!(
    T1 v1 0,
);
impl_tuple!(
    T1 v1 0,
    T2 v2 1,
);
impl_tuple!(
    T1 v1 0,
    T2 v2 1,
    T3 v3 2,
);
impl_tuple!(
    T1 v1 0,
    T2 v2 1,
    T3 v3 2,
    T4 v4 3,
);
impl_tuple!(
    T1 v1 0,
    T2 v2 1,
    T3 v3 2,
    T4 v4 3,
    T5 v5 4,
);
impl_tuple!(
    T1 v1 0,
    T2 v2 1,
    T3 v3 2,
    T4 v4 3,
    T5 v5 4,
    T6 v6 5,
);
impl_tuple!(
    T1 v1 0,
    T2 v2 1,
    T3 v3 2,
    T4 v4 3,
    T5 v5 4,
    T6 v6 5,
    T7 v7 6,
);
impl_tuple!(
    T1 v1 0,
    T2 v2 1,
    T3 v3 2,
    T4 v4 3,
    T5 v5 4,
    T6 v6 5,
    T7 v7 6,
    T8 v8 7,
);
impl_tuple!(
    T1 v1 0,
    T2 v2 1,
    T3 v3 2,
    T4 v4 3,
    T5 v5 4,
    T6 v6 5,
    T7 v7 6,
    T8 v8 7,
    T9 v9 8,
);
impl_tuple!(
    T1 v1 0,
    T2 v2 1,
    T3 v3 2,
    T4 v4 3,
    T5 v5 4,
    T6 v6 5,
    T7 v7 6,
    T8 v8 7,
    T9 v9 8,
    T10 v10 9,
);
impl_tuple!(
    T1 v1 0,
    T2 v2 1,
    T3 v3 2,
    T4 v4 3,
    T5 v5 4,
    T6 v6 5,
    T7 v7 6,
    T8 v8 7,
    T9 v9 8,
    T10 v10 9,
    T11 v11 10,
);
impl_tuple!(
    T1 v1 0,
    T2 v2 1,
    T3 v3 2,
    T4 v4 3,
    T5 v5 4,
    T6 v6 5,
    T7 v7 6,
    T8 v8 7,
    T9 v9 8,
    T10 v10 9,
    T11 v11 10,
    T12 v12 11,
);