advent_of_code_data/
registry.rs1use std::collections::HashMap;
2
3use thiserror::Error;
4
5use crate::{Answer, Day, Year};
6
7#[derive(Error, Debug)]
8pub enum SolverError {
9 #[error("there is not answer because the solver is not finished")]
10 NotFinished,
11 #[error(transparent)]
12 Other(#[from] anyhow::Error),
13}
14
15pub type Result<T> = core::result::Result<T, SolverError>;
16pub type SolverFn = fn(&str) -> Result<Answer>;
17
18#[derive(Clone, Debug)]
19pub struct Solver {
20 pub day: Day,
21 pub year: Year,
22 pub part_one: SolverFn,
23 pub part_two: SolverFn,
24}
25
26pub struct SolverRegistry {
27 solvers: HashMap<Year, HashMap<Day, Solver>>,
28}
29
30impl SolverRegistry {
31 pub fn new(all_solvers: &[Solver]) -> Self {
32 let mut solvers: HashMap<Year, HashMap<Day, Solver>> = Default::default();
33
34 for s in all_solvers.iter() {
35 match solvers.get_mut(&s.year) {
36 Some(solvers_for_year) => {
37 solvers_for_year.insert(s.day, s.clone());
38 }
39 None => {
40 solvers.insert(s.year, HashMap::from([(s.day, s.clone())]));
41 }
42 }
43 }
44
45 Self { solvers }
46 }
47
48 pub fn years(&self) -> Vec<Year> {
49 self.solvers.keys().cloned().collect()
50 }
51
52 pub fn days(&self, _year: Year) -> Vec<Day> {
53 todo!()
54 }
55
56 pub fn solver(&self, _day: Day, _yearr: Year) -> &Solver {
57 todo!()
58 }
59
60 pub fn run_all(&self) {
61 for solvers_for_year in self.solvers.values() {
63 for s in solvers_for_year.values() {
64 let a1 = (s.part_one)("");
65 let a2 = (s.part_two)("");
66
67 println!(
68 "day {}, year {}: part 1 = `{:#?}`, part 2 = `{:#?}`",
69 s.day, s.year, a1, a2
70 );
71 }
72 }
73 }
74}