use alloc::vec::Vec;
use crate::{
parse::Reader,
producers::{Producer, ProducerKind, VersionedSoftware},
seal::Seal,
wasm::Read as _,
};
pub trait Read<'a>: Seal {
fn producers(&mut self) -> Option<Vec<Producer<'a>>>;
}
impl<'a> Read<'a> for Reader<'a> {
fn producers(&mut self) -> Option<Vec<Producer<'a>>> {
(0..self.integer()?)
.map(|_| {
let kind = match &*self.name()? {
"language" => ProducerKind::Language,
"processed-by" => ProducerKind::ProcessedBy,
"sdk" => ProducerKind::Sdk,
_ => return None,
};
let software = (0..self.integer()?)
.map(|_| {
Some(VersionedSoftware {
name: self.name()?,
version: self.name()?,
})
})
.collect::<Option<_>>()?;
Some(Producer {
kind,
list: software,
})
})
.collect()
}
}