predawn-macro 0.9.0

Macros for predawn
Documentation
mod controller;
mod method;
mod multi_request_media_type;
mod multi_response;
mod multi_response_media_type;
mod multipart;
mod schema_attr;
mod security_scheme;
mod serde_attr;
mod single_response;
mod tag;
mod to_parameters;
mod to_schema;
mod types;
mod util;

use from_attr::FromAttr;
use proc_macro::TokenStream;
use syn::{parse_macro_input, DeriveInput, ItemImpl};

#[proc_macro_attribute]
pub fn controller(attr: TokenStream, item: TokenStream) -> TokenStream {
    let attr = match controller::ControllerAttr::from_tokens(attr.into()) {
        Ok(attr) => attr,
        Err(e) => return e.to_compile_error().into(),
    };
    let item_impl = parse_macro_input!(item as ItemImpl);

    controller::generate(attr, item_impl)
        .unwrap_or_else(|e| e.to_compile_error())
        .into()
}

#[proc_macro_derive(ToSchema, attributes(schema))]
pub fn to_schema(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);

    to_schema::generate(input)
        .unwrap_or_else(|e| e.to_compile_error())
        .into()
}

#[proc_macro_derive(ToParameters, attributes(schema))]
pub fn to_parameters(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);

    to_parameters::generate(input)
        .unwrap_or_else(|e| e.to_compile_error())
        .into()
}

#[doc = include_str!("docs/multi_request_media_type.md")]
#[proc_macro_derive(MultiRequestMediaType, attributes(multi_request_media_type))]
pub fn multi_request_media_type(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);

    multi_request_media_type::generate(input)
        .unwrap_or_else(|e| e.to_compile_error())
        .into()
}

#[doc = include_str!("docs/multi_response_media_type.md")]
#[proc_macro_derive(MultiResponseMediaType, attributes(multi_response_media_type))]
pub fn multi_response_media_type(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);

    multi_response_media_type::generate(input)
        .unwrap_or_else(|e| e.to_compile_error())
        .into()
}

#[doc = include_str!("docs/single_response.md")]
#[proc_macro_derive(SingleResponse, attributes(single_response, header))]
pub fn single_response(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);

    single_response::generate(input)
        .unwrap_or_else(|e| e.to_compile_error())
        .into()
}

#[doc = include_str!("docs/multi_response.md")]
#[proc_macro_derive(MultiResponse, attributes(multi_response, status))]
pub fn multi_response(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);

    multi_response::generate(input)
        .unwrap_or_else(|e| e.to_compile_error())
        .into()
}

#[doc = include_str!("docs/multipart.md")]
#[proc_macro_derive(Multipart, attributes(schema))]
pub fn multipart(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);

    multipart::generate(input)
        .unwrap_or_else(|e| e.to_compile_error())
        .into()
}

#[doc = include_str!("docs/tag.md")]
#[proc_macro_derive(Tag, attributes(tag))]
pub fn tag(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);

    tag::generate(input)
        .unwrap_or_else(|e| e.to_compile_error())
        .into()
}

#[doc = include_str!("docs/security_scheme.md")]
#[proc_macro_derive(SecurityScheme, attributes(api_key, http))]
pub fn security_scheme(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);

    security_scheme::generate(input)
        .unwrap_or_else(|e| e.to_compile_error())
        .into()
}