muse2/
year.rs

1//! Code for working with years.
2use anyhow::{ensure, Result};
3
4/// Parse a string of years separated by semicolons into a vector of u32 years.
5///
6/// The string can be either "all" (case-insensitive), a single year, or a semicolon-separated list
7/// of years (e.g. "2020;2021;2022" or "2020; 2021; 2022")
8pub fn parse_year_str(s: &str, milestone_years: &[u32]) -> Result<Vec<u32>> {
9    let s = s.trim();
10    ensure!(!s.is_empty(), "No years provided");
11
12    if s.eq_ignore_ascii_case("all") {
13        return Ok(Vec::from_iter(milestone_years.iter().copied()));
14    }
15
16    s.split(";")
17        .map(|y| {
18            let year = y.trim().parse::<u32>()?;
19            ensure!(
20                milestone_years.binary_search(&year).is_ok(),
21                "Invalid year {year}"
22            );
23            Ok(year)
24        })
25        .collect()
26}