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 expansions = [
expand::expand_into_schema(input.clone()),
expand::expand_from_schema(input.clone()),
codegen::wire::expand(&input, true),
codegen::wire::expand(&input, false),
codegen::wire::expand_schema(&input),
];
let mut output = proc_macro2::TokenStream::new();
let mut errors: Option<syn::Error> = None;
for expansion in expansions {
match expansion {
Ok(tokens) => output.extend(tokens),
Err(error) => match &mut errors {
Some(errors) => errors.combine(error),
None => errors = Some(error),
},
}
}
errors.map_or(output, syn::Error::into_compile_error).into()
}