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_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);