diff options
Diffstat (limited to 'ebml_derive/src/lib.rs')
-rw-r--r-- | ebml_derive/src/lib.rs | 26 |
1 files changed, 23 insertions, 3 deletions
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::<Vec<_>>(); + let master_match = tags + .iter() + .map(|Tag { id, r#type, .. }| match r#type { + None => quote!(#id => true), + Some(_) => quote!(#id => false), }) .collect::<Vec<_>>(); 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<bool> { + Ok(match id { #(#master_match),*, _ => anyhow::bail!("unknown id") }) + } pub fn parse(id: u64, data: &[u8]) -> anyhow::Result<Self> { - Ok(match id { #(#parse_match),*, _ => anyhow::bail!("unknown id") }) + Ok(match id { #(#parse_match),*, _ => anyhow::bail!("unknown id or master") }) } } } |