aboutsummaryrefslogtreecommitdiff
path: root/ebml_derive
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-01-13 18:06:11 +0100
committermetamuffin <metamuffin@disroot.org>2023-01-13 18:06:11 +0100
commit8fc4b9792044d82e729e8b4ef993c6391d711c5b (patch)
treead69a04a83e876dce4ebb15513c69fad757483d8 /ebml_derive
parentb192ec740d358d0e12eedd1308d006e080b3d8c2 (diff)
downloadjellything-8fc4b9792044d82e729e8b4ef993c6391d711c5b.tar
jellything-8fc4b9792044d82e729e8b4ef993c6391d711c5b.tar.bz2
jellything-8fc4b9792044d82e729e8b4ef993c6391d711c5b.tar.zst
started writing a proc_macro now
Diffstat (limited to 'ebml_derive')
-rw-r--r--ebml_derive/src/lib.rs63
-rw-r--r--ebml_derive/src/main.rs6
2 files changed, 63 insertions, 6 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()
+}
diff --git a/ebml_derive/src/main.rs b/ebml_derive/src/main.rs
deleted file mode 100644
index ac0ea26..0000000
--- a/ebml_derive/src/main.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-
-#[proc_macro]
-fn define_ebml(tt: TokenStream) {
-
-}
-