1extern crate proc_macro;
2
3use crate::proc_macro::TokenStream;
4use quote::quote;
5use syn;
6
7use syn::{parse_macro_input, parse_quote, ItemFn, ItemStruct, ItemEnum};
8
9use dtypei;
10
11mod utils;
12mod fields_parse;
13mod function_parse;
14mod structure_parse;
15mod enum_parse;
16
17#[proc_macro_attribute]
18pub fn dtypei_attr(args: TokenStream, input: TokenStream) -> TokenStream {
19 assert!(args.is_empty());
20
21 let inputstr = &input.to_string();
22
23 if inputstr.contains("wasm_bindgen") {
24 return input;
25 }
26
27 let mut functiont = parse_macro_input!(input as ItemFn);
28 let dtype_func = function_parse::parse(&functiont);
29
30 dtypei::istradd(format!("{}", dtype_func));
31
32 if inputstr.contains("typedinterface") {
33 let interf = dtypei::istrget().into_iter().map(|item| {
34 let tokenized: proc_macro2::TokenStream = item.parse().unwrap();
35 tokenized
36 });
37
38 functiont.block = Box::new(parse_quote!({
39 vec![
40 #(#interf),*
41 ]
42 }));
43
44 return TokenStream::from(quote!(#functiont));
45 }
46
47 TokenStream::from(quote!(#functiont))
48}
49
50#[proc_macro_attribute]
51pub fn dtypei_struct(args: TokenStream, input: TokenStream) -> TokenStream {
52 assert!(args.is_empty());
53
54 let structt = parse_macro_input!(input as ItemStruct);
55 let dtype_struct = structure_parse::parse(&structt);
56
57 dtypei::istradd(format!("{}", dtype_struct));
58
59 TokenStream::from(quote!(#structt))
60
61}
62
63#[proc_macro_attribute]
64pub fn dtypei_enum(args: TokenStream, input: TokenStream) -> TokenStream {
65 assert!(args.is_empty());
66
67 let enumt = parse_macro_input!(input as ItemEnum);
68 let dtype_enum = enum_parse::parse(&enumt);
69
70 dtypei::istradd(format!("{}", dtype_enum));
71
72 TokenStream::from(quote!(#enumt))
73}