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), (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)
);