diff options
author | metamuffin <metamuffin@disroot.org> | 2023-01-14 10:39:06 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-01-14 10:39:06 +0100 |
commit | 855a8896175ee45a3376775203fa20e629d809b3 (patch) | |
tree | a63cfbbb3118ec976da2ab4f3d2f24630ab33400 /ebml_derive/src | |
parent | 36e91c20eb59e76d5aeb35e644e7fb391f346dc6 (diff) | |
download | jellything-855a8896175ee45a3376775203fa20e629d809b3.tar jellything-855a8896175ee45a3376775203fa20e629d809b3.tar.bz2 jellything-855a8896175ee45a3376775203fa20e629d809b3.tar.zst |
matroska part 1
Diffstat (limited to 'ebml_derive/src')
-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") }) } } } |