1extern crate proc_macro;
2
3use proc_macro2::TokenStream;
4use quote::quote;
5use syn::DeriveInput;
6
7#[macro_use]
8mod macros;
9
10mod basic_types;
11mod syn_types;
12mod tokens;
13
14#[proc_macro_derive(Schema)]
15pub fn derive_schema(item: proc_macro::TokenStream) -> proc_macro::TokenStream {
16 match do_derive_schema(item.into()) {
17 Ok(result) => result.into(),
18 Err(err) => err.to_compile_error().into(),
19 }
20}
21
22fn do_derive_schema(item: TokenStream) -> syn::Result<TokenStream> {
23 let input = syn::parse2::<DeriveInput>(item)?;
24
25 let output = input.teleport();
26 let name = input.ident;
27 let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
28
29 Ok(quote! {
30 impl #impl_generics Schema for #name #ty_generics #where_clause{
31 fn schema() -> schema::DeriveInput {
32 #output
33 }
34 }
35 })
36}
37
38trait Teleporter {
39 fn teleport(&self) -> TokenStream;
40
41 fn name() -> &'static str {
42 std::any::type_name::<Self>()
43 }
44}