Use build script instead.

Map between macro and independen languages for better coverage.
This commit is contained in:
2020-08-05 07:54:39 +02:00
parent 219aa3e033
commit 7eda9ac670
7 changed files with 869 additions and 959 deletions

View File

@@ -109,8 +109,8 @@ fn main() -> Result<()> {
}
}
let mut languages = Vec::new();
let mut matchers = Vec::new();
let stdout = io::stdout();
let mut lock = stdout.lock();
for (language, mut results) in entries.into_iter() {
results.sort_unstable();
@@ -170,96 +170,14 @@ fn main() -> Result<()> {
regex.push_str(")+$");
let re = Regex::new(&regex).expect("failed to build regex");
let _ = Regex::new(&regex).expect("failed to build regex");
languages.push(language);
matchers.push(re);
assert!(!regex.contains('\n'));
assert!(!regex.contains('\t'));
writeln!(lock, "{}\t{}", language.to_639_3(), regex).expect("failed to write to stdout");
}
assert_eq!(languages.len(), matchers.len());
if languages.is_empty() {
return Ok(());
}
let stdout = io::stdout();
let mut lock = stdout.lock();
writeln!(lock, "use isolang::Language;").expect("failed to write to stdout");
writeln!(lock, "use once_cell::sync::Lazy;").expect("failed to write to stdout");
writeln!(lock, "use regex::{{Regex, RegexSet}};").expect("failed to write to stdout");
writeln!(lock).expect("failed to write to stdout");
writeln!(
lock,
"pub static LANGUAGES: [Language; {}] = [",
languages.len()
)
.expect("failed to write to stdout");
for language in &languages {
writeln!(lock, " Language::{},", title(language.to_639_3()))
.expect("failed to write to stdout");
}
writeln!(lock, "];").expect("failed to write to stdout");
writeln!(lock).expect("failed to write to stdout");
writeln!(
lock,
"pub static REGEX_SET: Lazy<RegexSet> = Lazy::new(|| {{",
)
.expect("failed to write to stdout");
writeln!(lock, " RegexSet::new(vec![",).expect("failed to write to stdout");
for matcher in &matchers {
writeln!(lock, " \"{}\",", matcher).expect("failed to write to stdout");
}
writeln!(lock, " ]).unwrap()",).expect("failed to write to stdout");
writeln!(lock, "}});").expect("failed to write to stdout");
writeln!(lock).expect("failed to write to stdout");
for (language, matcher) in languages.iter().zip(matchers.iter()) {
writeln!(
lock,
"pub static RE_{}: Lazy<Regex> = Lazy::new(|| Regex::new(\"{}\").unwrap());",
language.to_639_3().to_ascii_uppercase(),
matcher,
)
.expect("failed to write to stdout");
}
writeln!(lock).expect("failed to write to stdout");
writeln!(lock, "impl super::LanguageExt for Language {{",).expect("failed to write to stdout");
writeln!(
lock,
" fn is_match(&self, word: &str) -> Option<bool> {{",
)
.expect("failed to write to stdout");
writeln!(lock, " match self {{",).expect("failed to write to stdout");
for language in &languages {
writeln!(
lock,
" Language::{} => Some(RE_{}.is_match(word)),",
title(language.to_639_3()),
language.to_639_3().to_ascii_uppercase(),
)
.expect("failed to write to stdout");
}
writeln!(lock, " _ => None,",).expect("failed to write to stdout");
writeln!(lock, " }}",).expect("failed to write to stdout");
writeln!(lock, " }}",).expect("failed to write to stdout");
writeln!(lock, "}}",).expect("failed to write to stdout");
lock.flush().expect("failed to flush to stdout");
Ok(())