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}