aoc_framework_macros/
lib.rs

1use attribute_derive::Attribute;
2use proc_macro::{TokenStream, Span};
3use syn::{parse_macro_input, ItemFn, Ident};
4use quote::quote;
5
6#[proc_macro_attribute]
7pub fn aoc_solution(attr: TokenStream, item: TokenStream) -> TokenStream {
8
9    let args = parse_macro_input!(attr as AoCMeta);
10    let (year, day, part, parser) = (args.year, args.day, args.part, args.parser);
11    let name = Ident::new(&format!("year{}_day{}_part{}", year, day, part), Span::call_site().into());
12    let func = parse_macro_input!(item as ItemFn);
13    let func_name = func.sig.ident.clone();
14
15    let a: TokenStream = quote! {
16
17        pub fn #name() -> String {
18            #func
19
20            let raw_input = aoc_input_loader::aoc_input_loader(#year, #day).load(false);
21            let input = aoc_parsers::#parser::#parser(&raw_input);
22
23            #func_name(&input)
24        }
25    }.into();
26
27    a.into()
28}
29
30#[derive(Attribute)]
31#[attribute(ident = aoc_solution)]
32struct AoCMeta {
33    part: isize,
34    day: isize,
35    year: isize,
36    parser: Ident
37}
38
39#[proc_macro_attribute]
40pub fn aoc_parser(attr: TokenStream, input: TokenStream) -> TokenStream {
41    let args = parse_macro_input!(attr as AoCParserMeta);
42    let name = Ident::new(&args.name, Span::call_site().into());
43    let func = parse_macro_input!(input as ItemFn);
44    let func_name = func.sig.ident.clone();
45    let func_return = func.sig.output.clone();
46
47    let a: TokenStream = quote! {
48
49        pub fn #name(raw_input: &String) #func_return {
50            #func
51
52            #func_name(raw_input)
53        }
54    }.into();
55
56    a.into()
57}
58
59
60#[derive(Attribute)]
61#[attribute(ident = aoc_parser)]
62struct AoCParserMeta {
63    name: String
64}