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#[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