use alloc::{borrow::Cow, collections::BTreeMap};
use crate::{parse::Writer, seal::Seal};
pub trait Write<'a>: Seal {
fn integer(&mut self, int: u32);
fn name(&mut self, name: impl AsRef<str>);
fn name_vector(&mut self, name_vector: &[Cow<'_, str>]);
fn name_map(&mut self, name_map: &BTreeMap<u32, Cow<'_, str>>);
fn indirect_name_map(
&mut self,
indirect_name_map: &BTreeMap<u32, BTreeMap<u32, Cow<'_, str>>>,
);
fn subsection(&mut self, subsection: u8, data: &[u8]);
}
impl<'a> Write<'a> for Writer<'a> {
fn integer(&mut self, int: u32) {
self.uleb128(int)
}
fn name(&mut self, name: impl AsRef<str>) {
let name = name.as_ref();
self.integer(name.len().try_into().unwrap_or(u32::MAX));
self.str(name);
}
fn name_vector(&mut self, name_vector: &[Cow<'_, str>]) {
self.integer(name_vector.len().try_into().unwrap_or(u32::MAX));
for name in name_vector {
self.name(name);
}
}
fn name_map(&mut self, name_map: &BTreeMap<u32, Cow<'_, str>>) {
self.integer(name_map.len().try_into().unwrap_or(u32::MAX));
for (key, value) in name_map {
self.integer(*key);
self.name(value);
}
}
fn indirect_name_map(
&mut self,
indirect_name_map: &BTreeMap<u32, BTreeMap<u32, Cow<'_, str>>>,
) {
self.integer(indirect_name_map.len().try_into().unwrap_or(u32::MAX));
for (key, value) in indirect_name_map {
self.integer(*key);
self.name_map(value);
}
}
fn subsection(&mut self, subsection: u8, data: &[u8]) {
self.u8(subsection);
self.bytes(data);
}
}