use std::{borrow::Cow, io::Result};
use crate::{
builder::{ToBox, WriteAndSeek},
BoxType,
};
pub struct DataBoxBuilder<'a> {
tbox: BoxType,
data: Cow<'a, [u8]>,
}
impl<'a> DataBoxBuilder<'a> {
pub fn from_borrowed(tbox: BoxType, data: &'a [u8]) -> Self {
Self {
tbox,
data: Cow::from(data),
}
}
pub fn from_owned(tbox: BoxType, data: Vec<u8>) -> Self {
Self {
tbox,
data: Cow::from(data),
}
}
}
impl<'a> ToBox for DataBoxBuilder<'a> {
fn box_type(&self) -> BoxType {
self.tbox
}
fn payload_size(&self) -> Result<usize> {
Ok(self.data.len())
}
fn write_payload(&self, to_stream: &mut dyn WriteAndSeek) -> Result<()> {
to_stream.write_all(&self.data)
}
}
#[cfg(test)]
mod tests {
#![allow(clippy::expect_used)]
#![allow(clippy::panic)]
#![allow(clippy::unwrap_used)]
use std::io::Cursor;
use hex_literal::hex;
use crate::{
box_type::DESCRIPTION_BOX_TYPE,
builder::{
to_box::{jumbf_size, write_jumbf},
DataBoxBuilder, ToBox,
},
};
#[test]
fn simple_box_borrowed() {
let expected_jumbf = hex!(
"00000026" "6a756d64" "00000000000000000000000000000000" "03" "746573742e64657363626f7800" );
let boxx = DataBoxBuilder::from_borrowed(DESCRIPTION_BOX_TYPE, &expected_jumbf[8..]);
assert_eq!(boxx.box_type(), DESCRIPTION_BOX_TYPE);
assert_eq!(boxx.payload_size().unwrap(), 30);
let mut payload = Cursor::new(Vec::<u8>::new());
boxx.write_payload(&mut payload).unwrap();
assert_eq!(*payload.into_inner(), expected_jumbf[8..]);
assert_eq!(jumbf_size(&boxx).unwrap(), 38);
let mut jumbf = Cursor::new(Vec::<u8>::new());
write_jumbf(&boxx, &mut jumbf).unwrap();
assert_eq!(*jumbf.into_inner(), expected_jumbf);
}
#[test]
fn simple_box_owned() {
let expected_jumbf = hex!(
"00000026" "6a756d64" "00000000000000000000000000000000" "03" "746573742e64657363626f7800" );
let boxx = DataBoxBuilder::from_owned(DESCRIPTION_BOX_TYPE, expected_jumbf[8..].to_owned());
assert_eq!(boxx.box_type(), DESCRIPTION_BOX_TYPE);
assert_eq!(boxx.payload_size().unwrap(), 30);
let mut payload = Cursor::new(Vec::<u8>::new());
boxx.write_payload(&mut payload).unwrap();
assert_eq!(*payload.into_inner(), expected_jumbf[8..]);
assert_eq!(jumbf_size(&boxx).unwrap(), 38);
let mut jumbf = Cursor::new(Vec::<u8>::new());
write_jumbf(&boxx, &mut jumbf).unwrap();
assert_eq!(*jumbf.into_inner(), expected_jumbf);
}
}