use cooklang::{Converter, CooklangParser};
use std::sync::OnceLock;
static PARSER: OnceLock<CooklangParser> = OnceLock::new();
pub fn get_parser() -> &'static CooklangParser {
PARSER.get_or_init(CooklangParser::canonical)
}
#[must_use]
pub fn get_converter() -> &'static Converter {
get_parser().converter()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_global_parser_singleton() {
let parser1 = get_parser();
let parser2 = get_parser();
assert!(std::ptr::eq(parser1, parser2));
}
#[test]
fn test_parser_works() {
let parser = get_parser();
let recipe = "@eggs{2} and @milk{250%ml}";
let (parsed, _warnings) = parser.parse(recipe).into_result().unwrap();
assert_eq!(parsed.ingredients.len(), 2);
assert_eq!(parsed.ingredients[0].name, "eggs");
assert_eq!(parsed.ingredients[1].name, "milk");
}
#[test]
fn test_converter_access() {
let converter = get_converter();
let _units: Vec<_> = converter.all_units().collect();
}
}