diff options
author | metamuffin <metamuffin@disroot.org> | 2023-01-13 18:06:11 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2023-01-13 18:06:11 +0100 |
commit | 8fc4b9792044d82e729e8b4ef993c6391d711c5b (patch) | |
tree | ad69a04a83e876dce4ebb15513c69fad757483d8 /ebml_derive/src/lib.rs | |
parent | b192ec740d358d0e12eedd1308d006e080b3d8c2 (diff) | |
download | jellything-8fc4b9792044d82e729e8b4ef993c6391d711c5b.tar jellything-8fc4b9792044d82e729e8b4ef993c6391d711c5b.tar.bz2 jellything-8fc4b9792044d82e729e8b4ef993c6391d711c5b.tar.zst |
started writing a proc_macro now
Diffstat (limited to 'ebml_derive/src/lib.rs')
-rw-r--r-- | ebml_derive/src/lib.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/ebml_derive/src/lib.rs b/ebml_derive/src/lib.rs new file mode 100644 index 0000000..2c9dd9c --- /dev/null +++ b/ebml_derive/src/lib.rs @@ -0,0 +1,63 @@ +use proc_macro::{Delimiter, TokenStream, TokenTree}; +use quote::quote; + +struct Tag { + id: u64, + path: Vec<String>, + name: String, + r#type: Option<String>, // None -> Master +} + +#[proc_macro] +pub fn define_ebml(ts: TokenStream) -> TokenStream { + let mut next_glob = false; + let mut ts = ts.into_iter(); + + let mut tags = vec![]; + + while let Some(t) = ts.next() { + match t { + TokenTree::Ident(ident) => { + let ident = ident.to_string(); + if &ident == "global" { + next_glob = true; + } else { + let glob = next_glob; + next_glob = false; + let id = if let Some(TokenTree::Group(gr)) = ts.next() { + assert_eq!(gr.delimiter(), Delimiter::Bracket); + let mut ts = gr.stream().into_iter(); + if let TokenTree::Literal(lit) = ts.next().unwrap() { + u64::from_str_radix(&lit.to_string()[2..], 16).unwrap() + } else { + panic!("literal expected") + } + } else { + panic!("group expected") + }; + if let Some(TokenTree::Punct(p)) = ts.next() { + assert_eq!(p.as_char(), ':') + } else { + panic!("colon expected") + } + match ts.next() { + Some(TokenTree::Group(_)) => {} + Some(TokenTree::Ident(ident)) => { + let r#type = ident.to_string(); + eprintln!("global={glob} id={id}, type={}", r#type); + + } + _ => panic!("group or ident expected"), + } + if let Some(TokenTree::Punct(p)) = ts.next() { + assert_eq!(p.as_char(), ',') + } else { + panic!("colon expected") + } + } + } + x => panic!("unexpected {x:?}"), + } + } + quote! {}.into() +} |