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::encode_parameter_value;
use crate::SetParameterValue;

pub trait SetParameterTuple: Sized {
    fn get_tuple_element(&self, index: usize, data_type: u32) -> Result<Vec<u8>, String>;
}

impl<V1> SetParameterTuple for V1
where
    V1: SetParameterValue,
{
    fn get_tuple_element(&self, index: usize, data_type: u32) -> Result<Vec<u8>, String> {
        match index {
            0 => Ok(encode_parameter_value(data_type, self)),
            _ => Err("Invalid tuple size".to_string()),
        }
    }
}

impl<V1> SetParameterTuple for (V1,)
where
    V1: SetParameterValue,
{
    fn get_tuple_element(&self, index: usize, data_type: u32) -> Result<Vec<u8>, String> {
        match index {
            0 => Ok(encode_parameter_value(data_type, &self.0)),
            _ => Err("Invalid tuple size".to_string()),
        }
    }
}

macro_rules! impl_get_tuple_element {
    ($(($name:ident, $id:tt)),*) => {
        impl<$($name),*> SetParameterTuple for ($($name,)*)
         where
            $($name: SetParameterValue),*
        {
            fn get_tuple_element(&self, index: usize, data_type: u32) -> Result<Vec<u8>, String> {
                match index {
                    $($id => Ok(encode_parameter_value(data_type, &self.$id)),)*
                    _ => Err("Invalid tuple size".to_string()),

                }
            }
        }
    };
}

// impl_get_tuple_element!((V1, 0));
// impl_get_tuple_element!((V1, 0),);
impl_get_tuple_element!((V1, 0), (V2, 1));
impl_get_tuple_element!((V1, 0), (V2, 1), (V3, 2));
impl_get_tuple_element!((V1, 0), (V2, 1), (V3, 2), (V4, 3));
impl_get_tuple_element!((V1, 0), (V2, 1), (V3, 2), (V4, 3), (V5, 4));
impl_get_tuple_element!((V1, 0), (V2, 1), (V3, 2), (V4, 3), (V5, 4), (V6, 5));
impl_get_tuple_element!(
    (V1, 0),
    (V2, 1),
    (V3, 2),
    (V4, 3),
    (V5, 4),
    (V6, 5),
    (V7, 6)
);
impl_get_tuple_element!(
    (V1, 0),
    (V2, 1),
    (V3, 2),
    (V4, 3),
    (V5, 4),
    (V6, 5),
    (V7, 6),
    (V8, 7)
);
impl_get_tuple_element!(
    (V1, 0),
    (V2, 1),
    (V3, 2),
    (V4, 3),
    (V5, 4),
    (V6, 5),
    (V7, 6),
    (V8, 7),
    (V9, 8)
);
impl_get_tuple_element!(
    (V1, 0),
    (V2, 1),
    (V3, 2),
    (V4, 3),
    (V5, 4),
    (V6, 5),
    (V7, 6),
    (V8, 7),
    (V9, 8),
    (V10, 9)
);