assemble_macros/
lib.rs

1#[macro_use]
2extern crate proc_macro_error;
3#[macro_use]
4extern crate strum;
5
6use crate::derive::create_task::CreateTask;
7use crate::derive::io_task::TaskIO;
8
9use derive::TaskVisitor;
10use proc_macro::TokenStream;
11use quote::ToTokens;
12
13use syn::visit::Visit;
14use syn::{parse_macro_input, DeriveInput, ItemFn, Lit};
15
16mod actions;
17mod derive;
18
19/// Creates tasks using default values. Also creates lazy_evaluation using the name of the field
20#[proc_macro_derive(CreateTask)]
21#[proc_macro_error]
22pub fn derive_create_task(item: TokenStream) -> TokenStream {
23    let parsed = parse_macro_input!(item as DeriveInput);
24    let mut visitor = TaskVisitor::new(&parsed.ident, &parsed.generics, None);
25    visitor.visit_derive_input(&parsed);
26
27    TokenStream::from(CreateTask.derive_create_task(&visitor))
28}
29
30/// Enables shortcuts for adding inputs and outputs for tasks
31#[proc_macro_derive(TaskIO, attributes(input, output, description))]
32#[proc_macro_error]
33pub fn derive_io_task(item: TokenStream) -> TokenStream {
34    let parsed = parse_macro_input!(item as DeriveInput);
35
36    let description = parsed
37        .attrs
38        .iter()
39        .find(|att| att.path.is_ident("description"))
40        .map(|att| att.parse_args::<Lit>().expect("must be a string"))
41        .map(|lit| {
42            if let Lit::Str(str) = lit {
43                str.value()
44            } else {
45                panic!("must be a string literal")
46            }
47        });
48
49    let mut visitor = TaskVisitor::new(&parsed.ident, &parsed.generics, description);
50    visitor.visit_derive_input(&parsed);
51
52    TokenStream::from(TaskIO::derive_task_io(&visitor).unwrap())
53}
54
55#[proc_macro_attribute]
56pub fn plug(_attr: TokenStream, item: TokenStream) -> TokenStream {
57    item
58}