aoc

Macro all_puzzles

source
macro_rules! all_puzzles {
    ($callback:path $(,$arg:tt)*$(,)?) => { ... };
}
Expand description

Macro which invokes a callback macro with a list of all implemented puzzle solutions.

This macro chains puzzles! macros in the re-exported year modules. The callback macro will be called once with all the solutions, which makes it easy to generate match statements or arrays.

Running cargo xtask update will automatically update the chain of year macros.

ยงExamples

Simple main function to run all examples:

macro_rules! callback {
    ($(
        $y:literal => $year:ident{$(
            $d:literal => $day:ident,
        )*}
    )*) => {$($(
        println!("{} {}", $y, $d);
        for (input_str, p1, p2) in aoc::$year::$day::EXAMPLES {
            let solution = aoc::$year::$day::new(input_str, InputType::Example).unwrap();
            println!("  parse({input_str}) = {solution:?}");
            if (p1.is_some()) { println!("  part1(...) = {}", solution.part1()); }
            if (p2.is_some()) { println!("  part2(...) = {}", solution.part2()); }
        }
    )*)*};
}
all_puzzles!(callback);

Generating a match statement:

fn example_count(year: Year, day: Day) -> Option<usize> {
    macro_rules! callback {
        ($(
            $y:literal => $year:ident{$(
                $d:literal => $day:ident,
            )*}
        )*) => {
            match (year, day) {
                $($(
                    (aoc::$year::$day::YEAR, aoc::$year::$day::DAY) => Some(aoc::$year::$day::EXAMPLES.len()),
                )*)*
                _ => None,
            }
        };
    }
    all_puzzles!{callback}
}