#![cfg_attr(docsrs, feature(doc_cfg))]
#[cfg(feature = "configuration")]
#[cfg_attr(docsrs, doc(cfg(feature = "configuration")))]
mod configuration;
#[cfg(feature = "singleton")]
#[cfg_attr(docsrs, doc(cfg(feature = "singleton")))]
mod singleton;
mod common;
mod errors;
mod factory;
mod paths;
use proc_macro::TokenStream;
use syn::parse_macro_input;
use syn::DeriveInput;
use syn::ItemFn;
use self::configuration::ConfigurationFactory;
use self::errors::ProcMacroErrorExt;
use self::factory::Factory;
use self::singleton::SingletonFactory;
use self::singleton::SingletonFnFactory;
macro_rules! factory {
($new_factory_stmt: expr) => {
$new_factory_stmt
.map_or_else(
|mut err| err.as_compile_errors(),
|factory| {
factory
.build()
.unwrap_or_else(|mut err| err.as_compile_errors())
},
)
.into()
};
}
#[proc_macro_derive(Singleton, attributes(singleton))]
#[cfg(feature = "singleton")]
#[cfg_attr(docsrs, doc(cfg(feature = "singleton")))]
pub fn derive_singleton(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
factory!(SingletonFactory::new(&input))
}
#[proc_macro_attribute]
#[cfg(feature = "singleton")]
#[cfg_attr(docsrs, doc(cfg(feature = "singleton")))]
pub fn singleton_fn(_: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as ItemFn);
factory!(SingletonFnFactory::new(&input))
}
#[proc_macro_derive(Configuration, attributes(configuration))]
#[cfg(feature = "configuration")]
#[cfg_attr(docsrs, doc(cfg(feature = "configuration")))]
pub fn derive_configuration(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
factory!(ConfigurationFactory::new(input))
}