chiral_derive/
lib.rs

1use syn::parse::Parser;
2
3#[proc_macro_derive(Serialization)]
4pub fn derive_serial(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
5    let syn::DeriveInput { ident, .. } = syn::parse_macro_input!(input);
6    let output = quote::quote! {
7        impl Serialization for #ident {
8            fn ser_to(&self) -> SerializedFormat { serde_json::to_string(self).unwrap() }
9            fn ser_from(content: &SerializedFormat) -> Self { serde_json::from_str(content).unwrap() }
10        }
11    };
12    output.into()
13}
14
15// Report
16
17#[proc_macro_attribute]
18pub fn add_report_fields(_args: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream  {
19    let mut ast = syn::parse_macro_input!(input as syn::DeriveInput);
20    match &mut ast.data {
21        syn::Data::Struct(ref mut struct_data) => {           
22            match &mut struct_data.fields {
23                syn::Fields::Named(fields) => {
24                    fields.named.push(syn::Field::parse_named.parse2(quote::quote! { pub job_id: crate::job::ID}).unwrap());
25                    fields.named.push(syn::Field::parse_named.parse2(quote::quote! { pub cuk: crate::kinds::ComputingUnit }).unwrap());
26                    fields.named.push(syn::Field::parse_named.parse2(quote::quote! { pub input: Input }).unwrap());
27                    fields.named.push(syn::Field::parse_named.parse2(quote::quote! { pub output: Output }).unwrap());
28                }   
29                _ => {
30                    ()
31                }
32            }              
33            
34            return quote::quote! {
35                #ast
36            }.into();
37        }
38        _ => panic!("only for struct")
39    }
40}
41
42#[proc_macro_derive(ImplReport)]
43pub fn derive_report_generator(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
44    let syn::DeriveInput { ident, .. } = syn::parse_macro_input!(input);
45    let output = quote::quote! {
46        impl #ident {
47            pub fn new(t: (crate::job::ID, crate::kinds::ComputingUnit, &SerializedFormat, &Vec<SerializedFormat>)) -> Self {
48                let (job_id, cuk, input_ser, output_sers) = t;
49                let input = Input::ser_from(input_ser);
50                let mut output = Output::blank();
51                for output_ser in output_sers.iter() {
52                    output.append(&mut Output::ser_from(output_ser));
53                }
54                Self { job_id, cuk, input, output }
55            }
56        }
57    };
58    output.into()
59}
60
61#[proc_macro_derive(InputFileRequirements)]
62pub fn derive_input_file_requirements(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
63    let syn::DeriveInput { ident, .. } = syn::parse_macro_input!(input);
64    let output = quote::quote! {
65        impl crate::traits::TraitFileRequirements for #ident {}
66    };
67    output.into()
68}
69
70