use crate::{DataSource, Result, StdWriter};
use std::fmt::Debug;
pub struct DataBuilder {
chunks: Vec<(Box<dyn DataSource>, u64)>,
}
impl Debug for DataBuilder {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut list = f.debug_list();
let mut offset = 0;
for (index, chunk) in self.chunks.iter().enumerate() {
list.entry(&format!("{}: {} {:?}", index, offset, chunk));
offset += chunk.1.next_multiple_of(16);
}
list.finish()
}
}
impl DataBuilder {
pub fn new() -> Self {
Self { chunks: vec![] }
}
pub fn push(&mut self, data_source: Box<dyn DataSource>, size: u64) {
self.chunks.push((data_source, size));
}
pub fn append(&mut self, mut child: Self) {
self.chunks.append(&mut child.chunks);
}
pub fn size_bytes(&self) -> u64 {
let mut count = 0;
for chunk in &self.chunks {
let length = chunk.1.next_multiple_of(16);
count += length;
}
count
}
pub fn write(self, writer: &mut dyn std::io::Write) -> Result<()> {
for mut chunk in self.chunks {
let padding = chunk.1.next_multiple_of(16) - chunk.1;
let std_writer: &mut dyn StdWriter = (&mut chunk.0).try_into()?;
std_writer.write(writer)?;
writer.write_all(&vec![0; padding as usize])?;
}
Ok(())
}
}