aboutsummaryrefslogtreecommitdiff
path: root/ebml_derive/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ebml_derive/src/lib.rs')
-rw-r--r--ebml_derive/src/lib.rs26
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") })
}
}
}