use lazy_static::lazy_static; use rand::Rng; const RAW_TOOLTIPS: &str = include_str!("../tooltips.txt"); lazy_static! { static ref TOOLTIPS: Vec<&'static str> = RAW_TOOLTIPS .lines() .map(str::trim) .filter(|line| !line.is_empty() && !line.starts_with('#')) .collect(); } pub(crate) fn random_tooltip() -> Option<&'static str> { let mut rng = rand::rng(); pick_tooltip(&mut rng) } fn pick_tooltip(rng: &mut R) -> Option<&'static str> { if TOOLTIPS.is_empty() { None } else { TOOLTIPS.get(rng.random_range(0..TOOLTIPS.len())).copied() } } #[cfg(test)] mod tests { use super::*; use rand::SeedableRng; use rand::rngs::StdRng; #[test] fn random_tooltip_returns_some_tip_when_available() { let mut rng = StdRng::seed_from_u64(42); assert!(pick_tooltip(&mut rng).is_some()); } #[test] fn random_tooltip_is_reproducible_with_seed() { let expected = { let mut rng = StdRng::seed_from_u64(7); pick_tooltip(&mut rng) }; let mut rng = StdRng::seed_from_u64(7); assert_eq!(expected, pick_tooltip(&mut rng)); } }