use super::format::{enveloped, flac, mp4, Tag};
use super::generic::Version;
use super::util::{take_version, write_version};
use crate::error::Error;
use crate::util::Res;
use std::io;
#[derive(Debug)]
pub struct VidAssoc {
pub version: Version,
pub data: Vec<u8>,
}
impl Tag for VidAssoc {
const NAME: &'static str = "Serato VidAssoc";
fn parse(input: &[u8]) -> Result<Self, Error> {
let (_, vidassoc) = nom::combinator::all_consuming(take_vidassoc)(input)?;
Ok(vidassoc)
}
fn write(&self, writer: &mut impl io::Write) -> Result<usize, Error> {
write_vidassoc(writer, self)
}
}
impl enveloped::EnvelopedTag for VidAssoc {}
impl flac::FLACTag for VidAssoc {
const FLAC_COMMENT: &'static str = "SERATO_VIDASSOC";
}
impl mp4::MP4Tag for VidAssoc {
const MP4_ATOM_FREEFORM_NAME: &'static str = "videoassociation";
}
fn take_vidassoc(input: &[u8]) -> Res<&[u8], VidAssoc> {
let (input, version) = take_version(input)?;
let (input, data) = nom::combinator::rest(input)?;
let data = data.to_owned();
let vidassoc = VidAssoc { version, data };
Ok((input, vidassoc))
}
fn write_vidassoc(writer: &mut impl io::Write, vidassoc: &VidAssoc) -> Result<usize, Error> {
let mut bytes_written = write_version(writer, vidassoc.version)?;
bytes_written += writer.write(vidassoc.data.as_slice())?;
Ok(bytes_written)
}