From fd488ac8e49d5fa82ee431ce795919b031733b75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20M=C3=BCller?= Date: Mon, 8 Dec 2025 18:08:43 +0100 Subject: [PATCH] Add run_solver() function for testing --- src/solvers.rs | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/solvers.rs b/src/solvers.rs index 15877df..40586b1 100644 --- a/src/solvers.rs +++ b/src/solvers.rs @@ -23,6 +23,10 @@ pub trait Solver { fn process_data(&self, reader: R) -> (u64, u64); } +// The "../../data" and "../../../data" paths are useful for running the binary from +// "target/release/" directory with "data/" directory in package root or parent directory. +const DATA_PATHS: &'static [&'static str] = &["./data", "../data", "../../data", "../../../data"]; + pub fn run(solver: S) { println!( "--- Day {}: {} ---", @@ -30,29 +34,29 @@ pub fn run(solver: S) { solver.puzzle_name() ); - // TODO: Convert to constant and add "example" paths. - // The "../../data" and "../../../data" paths are useful for running the binary from - // "target/release/" directory with "data/" directory in package root or parent directory. - let paths = vec!["./data", "../data", "../../data", "../../../data"]; + match run_solver(solver, &DATA_PATHS) { + Ok(result) => print_result(result), + Err(error) => eprintln!("{}", error), + } +} - let filename = sanitise_file_name::sanitise(solver.puzzle_name()) +pub fn run_solver(solver: S, paths: &[&str]) -> Result<(u64, u64), String> { + let reader = read_data_file(input_filename(solver.puzzle_name()), paths)?; + Ok(solver.process_data(reader)) +} + +fn input_filename(puzzle_name: &str) -> String { + sanitise_file_name::sanitise(puzzle_name) .to_lowercase() .replace(" ", "_") - + ".txt"; - match read_data_file(filename, &paths) { - Ok(reader) => { - let result = solver.process_data(reader); - print_result(result); - } - Err(error) => eprintln!("{}", error), - }; + + ".txt" } fn print_result(result: (u64, u64)) { println!("Part 1: {:?}\nPart 2: {:?}\n", result.0, result.1); } -fn read_data_file(filename: String, search_paths: &Vec) -> Result, String> +fn read_data_file(filename: String, search_paths: &[T]) -> Result, String> where T: AsRef, {