use std::collections::HashMap;
pub const PROMOTE_THRESHOLD: u32 = parse_threshold_const();
const fn parse_threshold_const() -> u32 {
match option_env!("PINYIN_PROMOTE_THRESHOLD") {
Some(s) => parse_u32_const(s),
None => 3,
}
}
const fn parse_u32_const(s: &str) -> u32 {
let bytes = s.as_bytes();
if bytes.is_empty() {
panic!("PINYIN_PROMOTE_THRESHOLD must not be empty");
}
let mut i = 0;
let mut n: u32 = 0;
while i < bytes.len() {
let b = bytes[i];
if b < b'0' || b > b'9' {
panic!("PINYIN_PROMOTE_THRESHOLD must be ASCII digits");
}
n = n * 10 + (b - b'0') as u32;
i += 1;
}
if n == 0 {
panic!("PINYIN_PROMOTE_THRESHOLD must be >= 1");
}
n
}
#[derive(Debug, Clone, Default)]
pub struct L0Snapshot {
pub pins: Vec<(String, String)>,
pub pick_counts: Vec<(String, String, u32)>,
}
#[derive(Default)]
pub(crate) struct L0Inner {
pub(crate) pins: HashMap<String, String>,
pub(crate) pick_counts: HashMap<(String, String), u32>,
}
impl L0Inner {
pub(crate) fn new() -> Self {
Self::default()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn promote_threshold_is_at_least_one() {
const _GUARD: () = assert!(PROMOTE_THRESHOLD >= 1);
}
#[test]
fn snapshot_default_is_empty() {
let s = L0Snapshot::default();
assert!(s.pins.is_empty());
assert!(s.pick_counts.is_empty());
}
}