use crate::{BinaryReader, FromReader, Result, SectionLimited};
pub type ProducersSectionReader<'a> = SectionLimited<'a, ProducersField<'a>>;
#[derive(Debug, Clone)]
pub struct ProducersField<'a> {
pub name: &'a str,
pub values: SectionLimited<'a, ProducersFieldValue<'a>>,
}
impl<'a> FromReader<'a> for ProducersField<'a> {
fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
let offset = reader.original_position();
let name = reader.read_unlimited_string()?;
match name {
"language" | "sdk" | "processed-by" => {}
_ => bail!(offset, "invalid producers field name: `{name}`"),
}
let values = reader.skip(|reader| {
for _ in 0..reader.read_var_u32()? {
reader.skip_string()?;
reader.skip_string()?;
}
Ok(())
})?;
Ok(ProducersField {
name,
values: SectionLimited::new(values)?,
})
}
}
#[derive(Debug, Copy, Clone)]
pub struct ProducersFieldValue<'a> {
pub name: &'a str,
pub version: &'a str,
}
impl<'a> FromReader<'a> for ProducersFieldValue<'a> {
fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
let name = reader.read_unlimited_string()?;
let version = reader.read_unlimited_string()?;
Ok(ProducersFieldValue { name, version })
}
}