From 8fc4b9792044d82e729e8b4ef993c6391d711c5b Mon Sep 17 00:00:00 2001 From: metamuffin Date: Fri, 13 Jan 2023 18:06:11 +0100 Subject: started writing a proc_macro now --- ebml/src/lib.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 ebml/src/lib.rs (limited to 'ebml/src/lib.rs') diff --git a/ebml/src/lib.rs b/ebml/src/lib.rs new file mode 100644 index 0000000..116b8e2 --- /dev/null +++ b/ebml/src/lib.rs @@ -0,0 +1,49 @@ +use crate::read::EbmlSize; + +use self::read::EbmlReader; +use anyhow::{bail, Result}; +use log::debug; + +pub mod matroska; +pub mod read; +pub mod write; + +#[derive(Debug, Clone)] +pub enum Master { + Start, + End, +} + +#[derive(Debug, Clone)] +pub enum MatroskaTag { + Ebml(Master), + EbmlVersion(u64), + EbmlReadVersion(u64), + EbmlMaxIdLength(u64), + EbmlMaxSizeLength(u64), + DocType(String), + DocTypeVersion(u64), + DocTypeReadVersion(u64), + DocTypeExtension(Master), +} + +impl EbmlReader { + pub fn read_tag(&mut self) -> Result { + let id = self.read_tag_id()?; + let size = EbmlSize::from_vint(self.read_vint_len()?); + debug!("tag id={id:x}, size={size:?}"); + Ok(match id { + 0x1a45dfa3 => MatroskaTag::Ebml(Master::Start), + 0x4286 => MatroskaTag::EbmlVersion(self.read_vint()?), + 0x42f7 => MatroskaTag::EbmlReadVersion(self.read_vint()?), + 0x42f2 => MatroskaTag::EbmlMaxIdLength(self.read_vint()?), + 0x42f3 => MatroskaTag::EbmlMaxSizeLength(self.read_vint()?), + 0x4282 => MatroskaTag::DocType(self.read_utf8(size)?), + 0x4287 => MatroskaTag::DocTypeVersion(self.read_vint()?), + 0x4285 => MatroskaTag::DocTypeReadVersion(self.read_vint()?), + 0x4281 => MatroskaTag::DocTypeExtension(Master::Start), + + _ => bail!("thats not a tag we know..."), + }) + } +} -- cgit v1.2.3-70-g09d2