From 855a8896175ee45a3376775203fa20e629d809b3 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Sat, 14 Jan 2023 10:39:06 +0100 Subject: matroska part 1 --- ebml_derive/src/lib.rs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'ebml_derive/src') diff --git a/ebml_derive/src/lib.rs b/ebml_derive/src/lib.rs index 07e60f9..f3957df 100644 --- a/ebml_derive/src/lib.rs +++ b/ebml_derive/src/lib.rs @@ -53,13 +53,30 @@ pub fn define_ebml(ts: TokenStream) -> TokenStream { let parse_match = tags .iter() - .map(|Tag { id, name, .. }| { - quote! { #id => Self::#name(crate::ValueFromBuf::from_buf(data)?) } + .map( + |Tag { + id, name, r#type, .. + }| { + if let Some(_) = r#type { + quote! { #id => Self::#name(crate::ValueFromBuf::from_buf(data)?) } + } else { + quote! { #id => Self::#name(Master::Start) } + } + }, + ) + .collect::>(); + let master_match = tags + .iter() + .map(|Tag { id, r#type, .. }| match r#type { + None => quote!(#id => true), + Some(_) => quote!(#id => false), }) .collect::>(); quote! { use crate::Master; + + #[derive(Debug)] pub enum MatroskaTag { #(#enum_variants),* } @@ -68,8 +85,11 @@ pub fn define_ebml(ts: TokenStream) -> TokenStream { pub fn path(&self) -> Option<&'static [u64]> { match self { #(#path_match),* } } + pub fn is_master(id: u64) -> anyhow::Result { + Ok(match id { #(#master_match),*, _ => anyhow::bail!("unknown id") }) + } pub fn parse(id: u64, data: &[u8]) -> anyhow::Result { - Ok(match id { #(#parse_match),*, _ => anyhow::bail!("unknown id") }) + Ok(match id { #(#parse_match),*, _ => anyhow::bail!("unknown id or master") }) } } } -- cgit v1.2.3-70-g09d2