use std::{fmt::Display, fs::read_to_string, time::Instant}; use color_eyre::eyre; use tracing_subscriber::EnvFilter; #[cfg(feature = "day1")] mod day01; #[cfg(feature = "day2")] mod day02; #[cfg(feature = "day3")] mod day03; #[cfg(feature = "day4")] mod day04; #[cfg(feature = "day5")] mod day05; #[cfg(feature = "day6")] mod day06; #[cfg(feature = "day7")] mod day07; #[cfg(feature = "day8")] mod day08; #[cfg(feature = "day9")] mod day09; #[cfg(feature = "day10")] mod day10; #[cfg(feature = "day11")] mod day11; #[cfg(feature = "day12")] mod day12; #[cfg(feature = "day13")] mod day13; #[cfg(feature = "day14")] mod day14; fn main() -> eyre::Result<()> { color_eyre::install()?; tracing_subscriber::fmt() .with_env_filter(EnvFilter::from_default_env()) .init(); #[cfg(feature = "day1")] solve_day(1, day01::pt1, day01::pt2); #[cfg(feature = "day2")] solve_day(2, day02::pt1, day02::pt2); #[cfg(feature = "day3")] solve_day(3, day03::pt1, day03::pt2); #[cfg(feature = "day4")] solve_day(4, day04::pt1, day04::pt2); #[cfg(feature = "day5")] solve_day(5, day05::pt1, day05::pt2); #[cfg(feature = "day6")] solve_day(6, day06::pt1, day06::pt2); #[cfg(feature = "day7")] solve_day(7, day07::pt1, day07::pt2); #[cfg(feature = "day8")] solve_day(8, day08::pt1, day08::pt2); #[cfg(feature = "day9")] solve_day(9, day09::pt1, day09::pt2); #[cfg(feature = "day10")] solve_day(10, day10::pt1, day10::pt2); #[cfg(feature = "day11")] solve_day(11, day11::pt1, day11::pt2); #[cfg(feature = "day12")] solve_day(12, day12::pt1, day12::pt2); #[cfg(feature = "day13")] solve_day(13, day13::pt1, day13::pt2); #[cfg(feature = "day14")] solve_day(14, day14::pt1, day14::pt2); Ok(()) } fn solve_day(day: u8, part_a: Fa, part_b: Fb) where Fa: Fn(&str) -> Ta, Ta: Display, Fb: Fn(&str) -> Tb, Tb: Display, { match read_to_string(format!("./inputs/day{day:02}/input.txt")) { Ok(input) => { let start = Instant::now(); let result_a = part_a(&input); tracing::info!("[{day:02}] Part A: {result_a} \tin {:?}", start.elapsed()); let start = Instant::now(); let result_b = part_b(&input); tracing::info!("[{day:02}] Part B: {result_b} \tin {:?}", start.elapsed()); } Err(_) => { tracing::warn!("could not open ./inputs/day{day:02}/input.txt"); } } }