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 RelVolAd {
pub version: Version,
pub data: Vec<u8>,
}
impl Tag for RelVolAd {
const NAME: &'static str = "Serato RelVolAd";
fn parse(input: &[u8]) -> Result<Self, Error> {
let (_, overview) = nom::combinator::all_consuming(take_relvolad)(input)?;
Ok(overview)
}
fn write(&self, writer: &mut impl io::Write) -> Result<usize, Error> {
write_relvolad(writer, self)
}
}
impl enveloped::EnvelopedTag for RelVolAd {}
impl flac::FLACTag for RelVolAd {
const FLAC_COMMENT: &'static str = "SERATO_RELVOL";
}
impl mp4::MP4Tag for RelVolAd {
const MP4_ATOM_FREEFORM_NAME: &'static str = "relvol";
}
fn take_relvolad(input: &[u8]) -> Res<&[u8], RelVolAd> {
let (input, version) = take_version(input)?;
let (input, data) = nom::combinator::rest(input)?;
let data = data.to_owned();
let relvolad = RelVolAd { version, data };
Ok((input, relvolad))
}
fn write_relvolad(writer: &mut impl io::Write, relvolad: &RelVolAd) -> Result<usize, Error> {
let mut bytes_written = write_version(writer, relvolad.version)?;
bytes_written += writer.write(relvolad.data.as_slice())?;
Ok(bytes_written)
}