advent_of_code_data/
registry.rs

1use 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        // TODO: move this out of registry and into CLI main.
62        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}