1use darling::FromDeriveInput;
2use proc_macro_error::proc_macro_error;
3use quote::quote;
4
5use crate::task::TaskDerive;
6
7extern crate proc_macro;
8
9mod task;
10
11#[proc_macro_error]
12#[proc_macro_derive(Task, attributes(task))]
13pub fn derive_task(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
14 let task = match syn::parse::<syn::DeriveInput>(input.clone()) {
15 Ok(task) => task,
16 Err(e) => {
17 proc_macro_error::emit_call_site_error!(e.to_string());
18 return input;
19 }
20 };
21 let task = match TaskDerive::from_derive_input(&task) {
22 Ok(task) => task,
23 Err(e) => {
24 proc_macro_error::emit_call_site_error!(e.to_string());
25 return input;
26 }
27 };
28
29 quote!(#task).into()
30}