use crate::id3::v2::error::FrameParseError;
use crate::id3::v2::{FrameFlags, FrameHeader, FrameId};
use std::borrow::Cow;
use std::io::Read;
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
pub struct BinaryFrame<'a> {
pub(crate) header: FrameHeader<'a>,
pub data: Cow<'a, [u8]>,
}
impl<'a> BinaryFrame<'a> {
pub fn new(id: FrameId<'a>, data: impl Into<Cow<'a, [u8]>>) -> Self {
let header = FrameHeader::new(id, FrameFlags::default());
Self {
header,
data: data.into(),
}
}
pub fn id(&self) -> &FrameId<'_> {
&self.header.id
}
pub fn flags(&self) -> FrameFlags {
self.header.flags
}
pub fn set_flags(&mut self, flags: FrameFlags) {
self.header.flags = flags;
}
pub fn parse<R>(
reader: &mut R,
id: FrameId<'a>,
frame_flags: FrameFlags,
) -> Result<Self, FrameParseError>
where
R: Read,
{
let mut data = Vec::new();
if let Err(e) = reader.read_to_end(&mut data) {
return Err(FrameParseError::new(Some(id.into_owned()), Box::new(e)));
}
let header = FrameHeader::new(id, frame_flags);
Ok(BinaryFrame {
header,
data: Cow::Owned(data),
})
}
pub fn as_bytes(&self) -> Vec<u8> {
let Self { data, .. } = self;
data.to_vec()
}
}
impl BinaryFrame<'_> {
pub(crate) fn borrow(&self) -> BinaryFrame<'_> {
BinaryFrame {
header: self.header.borrow(),
data: Cow::Borrowed(&self.data),
}
}
}