pub mod days; use std::{fmt::Display, fs, time::Instant}; use anyhow::Result; use log::info; pub fn run( name: &str, input_path: &str, parse: P, part_a: A, part_b: B, ) -> Result<()> where T: Clone, P: Fn(&[u8]) -> T, A: Fn(T) -> RA, B: Fn(T) -> RB, RA: Display, RB: Display, { let _ = env_logger::try_init(); let file = &fs::read_to_string(input_path)?; let bytes = file.as_bytes(); let label_parse = format!("{name} Parse"); let parse_start = Instant::now(); let input = parse(bytes); let parse_elapsed = parse_start.elapsed(); info!("{label_parse}"); info!("{}", "-".repeat(label_parse.len())); info!("Parse time: {:?}", parse_elapsed); info!(""); let label_a = format!("{name} Part A"); info!("{label_a}"); info!("{}", "-".repeat(label_a.len())); let part_a_start = Instant::now(); info!("Part A answer: {}", part_a(input.clone())); let part_a_elapsed = part_a_start.elapsed(); info!("Part A time: {:?}", part_a_elapsed); info!(""); let label_b = format!("{name} Part B"); info!("{label_b}"); info!("{}", "-".repeat(label_b.len())); let part_b_start = Instant::now(); info!("Part B answer: {}", part_b(input.clone())); let part_b_elapsed = part_b_start.elapsed(); info!("Part B time: {:?}", part_b_elapsed); info!(""); info!("Challenge time: {:?}", part_a_elapsed + part_b_elapsed); info!( "Total time: {:?}", part_a_elapsed + part_b_elapsed + parse_elapsed ); Ok(()) }