advent-of-code 2025.5.0

Solutions to Advent of Code
Documentation
#![forbid(unsafe_code)]

use std::env;
use std::io::Read;

use advent_of_code::solve_raw;

#[allow(clippy::print_stdout)]
#[allow(clippy::print_stderr)]
fn main() -> Result<(), String> {
    let usage = || -> ! {
        eprintln!("usage: advent-of-code [year] [day] [part] < [input-file]");
        std::process::exit(1);
    };

    let args: Vec<String> = env::args().collect();

    if args.iter().any(|s| s == "-v" || s == "--version") {
        println!(env!("CARGO_PKG_VERSION"));
        return Ok(());
    }

    let repeat = if let Ok(value) = env::var("AOC_REPEAT") {
        value
            .parse::<usize>()
            .map_err(|_| "Unable to parse AOC_REPEAT")?
    } else {
        1
    };

    if args.len() == 4 {
        let year = &args[1];
        let day = &args[2];
        let part = &args[3];
        let mut input = String::new();
        std::io::stdin()
            .read_to_string(&mut input)
            .map_err(|error| format!("Error reading input: {error}"))?;

        for _ in 0..repeat {
            match solve_raw(year, day, part, input.as_ref()) {
                Ok(result) => {
                    if repeat == 1 {
                        println!("{result}");
                    }
                }
                Err(error) => {
                    eprintln!("Error: {error}");
                    std::process::exit(1);
                }
            }
        }
    } else {
        usage();
    }
    Ok(())
}