mod app;
mod task;
use ferroforge_contracts::{TaskArguments, TaskContract};
use proc_macro::TokenStream;
use syn::{ItemFn, parse_macro_input};
#[proc_macro]
pub fn app(input: TokenStream) -> TokenStream {
let application = parse_macro_input!(input as app::App);
match app::expand(application) {
Ok(output) => output.into(),
Err(error) => error.to_compile_error().into(),
}
}
#[proc_macro_attribute]
pub fn task(attr: TokenStream, item: TokenStream) -> TokenStream {
let args = parse_macro_input!(attr as TaskArguments);
let function = parse_macro_input!(item as ItemFn);
let output = TaskContract::new(args, &function.sig)
.and_then(|contract| task::expand(contract, function));
match output {
Ok(output) => output.into(),
Err(error) => error.to_compile_error().into(),
}
}