Skip to main content

dtypei_derive/
lib.rs

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}