motorcortex-rust 0.5.0

Motorcortex Rust: a Rust client for the Motorcortex Core real-time control system (async + blocking).
Documentation
use crate::parameter_value::decode_parameter_value;
use crate::GetParameterValue;

pub trait GetParameterTuple: Sized {
    fn get_parameters<'a, I>(iter: I) -> Result<Self, String>
    where
        I: Iterator<Item = (&'a u32, &'a [u8])>;
}

// Macro to generate implementations for GetParameterTuple
macro_rules! impl_get_parameter_tuple {
    ($name:ident) => {
        impl<$name> GetParameterTuple for $name
        where
            $name: GetParameterValue + Default,
        {
            fn get_parameters<'a, I>(mut iter: I) -> Result<Self, String>
            where
                I: Iterator<Item = (&'a u32, &'a [u8])>,
            {
                if let Some((&dtype, value)) = iter.next() {
                    Ok(decode_parameter_value(dtype, value))
                } else {
                    Err("Insufficient parameters provided".to_string())
                }
            }
        }
    };

    ($name:ident,) => {
        impl<$name> GetParameterTuple for ($name,)
        where
            $name: GetParameterValue + Default,
        {
            fn get_parameters<'a, I>(mut iter: I) -> Result<Self, String>
            where
                I: Iterator<Item = (&'a u32, &'a [u8])>,
            {
                if let Some((&dtype, value)) = iter.next() {
                    Ok((decode_parameter_value(dtype, value),))
                } else {
                    Err("Insufficient parameters provided".to_string())
                }
            }
        }
    };

    ($($name:ident),+) => {
        impl<$($name),*> GetParameterTuple for ($($name,)*)
        where
            $($name: GetParameterValue + Default),*
        {
            fn get_parameters<'a, I>(mut iter: I) -> Result<Self, String>
            where
                I: Iterator<Item = (&'a u32, &'a [u8])>,
            {
                Ok((
                    $(
                        if let Some((&dtype, value)) = iter.next() {
                            decode_parameter_value::<$name>(dtype, value)
                        } else {
                            return Err("Insufficient parameters provided".to_string());
                        }
                    ),*
                ))
            }
        }
    };
}

impl_get_parameter_tuple!(V1);
impl_get_parameter_tuple!(V1,);
impl_get_parameter_tuple!(V1, V2);
impl_get_parameter_tuple!(V1, V2, V3);
impl_get_parameter_tuple!(V1, V2, V3, V4);
impl_get_parameter_tuple!(V1, V2, V3, V4, V5);
impl_get_parameter_tuple!(V1, V2, V3, V4, V5, V6);
impl_get_parameter_tuple!(V1, V2, V3, V4, V5, V6, V7);
impl_get_parameter_tuple!(V1, V2, V3, V4, V5, V6, V7, V8);
impl_get_parameter_tuple!(V1, V2, V3, V4, V5, V6, V7, V8, V9);
impl_get_parameter_tuple!(V1, V2, V3, V4, V5, V6, V7, V8, V9, V10);