extern crate proc_macro;
mod codegen;
mod expand;
mod parse;
use proc_macro::TokenStream;
use syn::{DeriveInput, parse_macro_input};
#[proc_macro_derive(IntoWire, attributes(schema))]
pub fn derive_into_wire(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
codegen::wire::expand(&input, true)
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_derive(FromWire, attributes(schema))]
pub fn derive_from_wire(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
codegen::wire::expand(&input, false)
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_derive(WireSchema, attributes(schema))]
pub fn derive_wire_schema(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
codegen::wire::expand_schema(&input)
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_derive(IntoSchema, attributes(schema))]
pub fn derive_into_schema(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
expand::expand_into_schema(input)
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_derive(FromSchema, attributes(schema))]
pub fn derive_from_schema(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
expand::expand_from_schema(input)
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_derive(PoemSchema, attributes(serde))]
pub fn derive_poem_schema(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
codegen::poem::expand_poem_schema(&input)
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_derive(Schema, attributes(schema))]
pub fn derive_schema(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let into_schema = expand::expand_into_schema(input.clone());
let from_schema = expand::expand_from_schema(input);
match (into_schema, from_schema) {
(Ok(into_schema), Ok(from_schema)) => quote::quote! {
#into_schema
#from_schema
}
.into(),
(Err(err), Ok(_)) | (Ok(_), Err(err)) => err.into_compile_error().into(),
(Err(mut first), Err(second)) => {
first.combine(second);
first.into_compile_error().into()
}
}
}