Skip to main content

schema_derive/
lib.rs

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}