mod auto;
mod config;
mod job;
mod nest;
mod route;
mod stream;
use proc_macro::TokenStream;
use syn::DeriveInput;
#[proc_macro_attribute]
pub fn route(args: TokenStream, input: TokenStream) -> TokenStream {
route::with_method(None, args, input)
}
#[proc_macro_attribute]
pub fn routes(_: TokenStream, input: TokenStream) -> TokenStream {
route::with_methods(input)
}
macro_rules! method_macro {
($variant:ident, $method:ident) => {
#[doc = concat!("#[", stringify!($method), r#"("path"[, attributes])]"#)]
#[doc = concat!("# use spring_macros::", stringify!($method), ";")]
#[doc = concat!("#[", stringify!($method), r#"("/")]"#)]
#[proc_macro_attribute]
pub fn $method(args: TokenStream, input: TokenStream) -> TokenStream {
route::with_method(Some(route::Method::$variant), args, input)
}
};
}
method_macro!(Get, get);
method_macro!(Post, post);
method_macro!(Put, put);
method_macro!(Delete, delete);
method_macro!(Head, head);
method_macro!(Options, options);
method_macro!(Trace, trace);
method_macro!(Patch, patch);
#[proc_macro_attribute]
pub fn nest(args: TokenStream, input: TokenStream) -> TokenStream {
nest::with_nest(args, input)
}
fn input_and_compile_error(mut item: TokenStream, err: syn::Error) -> TokenStream {
let compile_err = TokenStream::from(err.to_compile_error());
item.extend(compile_err);
item
}
macro_rules! job_macro {
($variant:ident, $job_type:ident, $example:literal) => {
#[doc = concat!("#[", stringify!($job_type), "(", $example, ")]")]
#[doc = concat!("# use spring_macros::", stringify!($job_type), ";")]
#[doc = concat!("#[", stringify!($job_type), "(", stringify!($example), ")]")]
#[proc_macro_attribute]
pub fn $job_type(args: TokenStream, input: TokenStream) -> TokenStream {
job::with_job(job::JobType::$variant, args, input)
}
};
}
job_macro!(OneShot, one_shot, 60);
job_macro!(FixDelay, fix_delay, 60);
job_macro!(FixRate, fix_rate, 60);
job_macro!(Cron, cron, "1/10 * * * * *");
#[proc_macro_attribute]
pub fn auto_config(args: TokenStream, input: TokenStream) -> TokenStream {
auto::config(args, input)
}
#[proc_macro_derive(Configurable, attributes(config_prefix))]
pub fn derive_config(input: TokenStream) -> TokenStream {
let input = syn::parse_macro_input!(input as DeriveInput);
config::expand_derive(input)
.unwrap_or_else(syn::Error::into_compile_error)
.into()
}
#[proc_macro_attribute]
pub fn stream_listener(args: TokenStream, input: TokenStream) -> TokenStream {
stream::listener(args, input)
}