93 lines
3 KiB
Rust
93 lines
3 KiB
Rust
#![cfg(test)]
|
|
|
|
use crate::{timeago::TimeUnit};
|
|
use fancy_regex::Regex;
|
|
use once_cell::sync::Lazy;
|
|
|
|
const TARGET_FILE: &str = "src/dictionary.rs";
|
|
|
|
fn parse_tu(tu: &str) -> (u8, Option<TimeUnit>) {
|
|
static TU_PATTERN: Lazy<Regex> = Lazy::new(|| Regex::new(r"^(\d*)(\w?)$").unwrap());
|
|
match TU_PATTERN.captures(tu).unwrap() {
|
|
Some(cap) => (
|
|
cap.get(1).unwrap().as_str().parse().unwrap_or(1),
|
|
match cap.get(2).unwrap().as_str() {
|
|
"s" => Some(TimeUnit::Second),
|
|
"m" => Some(TimeUnit::Minute),
|
|
"h" => Some(TimeUnit::Hour),
|
|
"D" => Some(TimeUnit::Day),
|
|
"W" => Some(TimeUnit::Week),
|
|
"M" => Some(TimeUnit::Month),
|
|
"Y" => Some(TimeUnit::Year),
|
|
"" => None,
|
|
_ => panic!("invalid time unit: {}", tu),
|
|
},
|
|
),
|
|
None => panic!("invalid time unit: {}", tu),
|
|
}
|
|
}
|
|
|
|
// #[test]
|
|
fn generate_dictionary() {
|
|
let dict = super::read_dict();
|
|
|
|
let code_head = r#"// This file is automatically generated. DO NOT EDIT.
|
|
use crate::{
|
|
model::Language,
|
|
timeago::{TaToken, TimeUnit},
|
|
};
|
|
|
|
pub struct Entry {
|
|
pub timeago_tokens: phf::Map<&'static str, TaToken>,
|
|
pub date_order: &'static str,
|
|
pub months: phf::Map<&'static str, u8>,
|
|
}
|
|
"#;
|
|
|
|
let mut code_timeago_tokens = r#"#[rustfmt::skip]
|
|
pub fn entry(lang: Language) -> Entry {
|
|
match lang {
|
|
"#
|
|
.to_owned();
|
|
|
|
dict.iter().for_each(|(lang, entry)| {
|
|
// Match selector
|
|
let mut selector = format!("Language::{:?}", lang);
|
|
entry.equivalent.iter().for_each(|eq| {
|
|
selector += &format!(" | Language::{:?}", eq);
|
|
});
|
|
|
|
// Timeago tokens
|
|
let mut ta_tokens = phf_codegen::Map::<&str>::new();
|
|
entry.timeago_tokens.iter().for_each(|(txt, tu_str)| {
|
|
let (n, unit) = parse_tu(&tu_str);
|
|
match unit {
|
|
Some(unit) => ta_tokens.entry(
|
|
&txt,
|
|
&format!("TaToken {{ n: {}, unit: Some(TimeUnit::{:?}) }}", n, unit),
|
|
),
|
|
None => ta_tokens.entry(&txt, &format!("TaToken {{ n: {}, unit: None }}", n)),
|
|
};
|
|
});
|
|
|
|
// Months
|
|
let mut months = phf_codegen::Map::<&str>::new();
|
|
entry.months.iter().for_each(|(txt, n_mon)| {
|
|
months.entry(&txt, &n_mon.to_string());
|
|
});
|
|
|
|
let code_ta_tokens = &ta_tokens.build().to_string().replace('\n', "\n ");
|
|
let code_months = &months.build().to_string().replace('\n', "\n ");
|
|
|
|
code_timeago_tokens += &format!(
|
|
"{} => Entry {{\n timeago_tokens: {},\n date_order: \"{}\",\n months: {},\n }},\n ",
|
|
selector, code_ta_tokens, entry.date_order, code_months
|
|
);
|
|
});
|
|
|
|
code_timeago_tokens = code_timeago_tokens.trim_end().to_owned() + "\n }\n}\n";
|
|
|
|
let code = format!("{}\n{}", code_head, code_timeago_tokens);
|
|
|
|
std::fs::write(TARGET_FILE, code).unwrap();
|
|
}
|