use crate::{
messages::submessages::submessage_elements::parameter::Parameter,
structure::parameter_id::ParameterId,
};
use speedy::{Readable, Writable, Context, Writer};
#[derive(Debug, PartialEq, Clone)]
pub struct ParameterList {
pub parameters: Vec<Parameter>,
}
impl ParameterList {
pub fn new() -> ParameterList {
ParameterList {
parameters: Vec::new(),
}
}
}
pub const PID_PAD: u16 = 0x00;
const SENTINEL: u32 = 0x00000001;
impl<C: Context> Writable<C> for ParameterList {
#[inline]
fn write_to<T: ?Sized + Writer<C>>(&self, writer: &mut T) -> Result<(), C::Error> {
for param in self.parameters.iter() {
writer.write_value(param)?;
}
writer.write_u32(SENTINEL)?;
Ok(())
}
}
impl<'a, C: Context> Readable<'a, C> for ParameterList {
#[inline]
fn read_from<R: speedy::Reader<'a, C>>(reader: &mut R) -> Result<Self, C::Error> {
let mut parameters = ParameterList::new();
loop {
let parameter_id = ParameterId::read_from(reader)?;
if parameter_id == ParameterId::PID_SENTINEL {
return Ok(parameters);
}
let length = u16::read_from(reader)?;
let parameter = Parameter {
parameter_id,
value: reader.read_vec(length as usize)?,
};
parameters.parameters.push(parameter);
}
}
}