fix: improve language docs + string parsing
This commit is contained in:
parent
86775ea95b
commit
e184341625
6 changed files with 255 additions and 92 deletions
|
|
@ -1,5 +1,7 @@
|
|||
use std::collections::BTreeMap;
|
||||
use std::fmt::Write;
|
||||
use std::fs::File;
|
||||
use std::io::BufReader;
|
||||
|
||||
use path_macro::path;
|
||||
use reqwest::header;
|
||||
|
|
@ -9,6 +11,7 @@ use serde_with::serde_as;
|
|||
use serde_with::VecSkipError;
|
||||
|
||||
use crate::model::Text;
|
||||
use crate::util::DICT_DIR;
|
||||
use crate::util::SRC_DIR;
|
||||
|
||||
#[serde_as]
|
||||
|
|
@ -141,16 +144,41 @@ struct LanguageCountryCommand {
|
|||
pub async fn generate_locales() {
|
||||
let (languages, countries) = get_locales().await;
|
||||
|
||||
let json_path = path!(*DICT_DIR / "lang_names.json");
|
||||
let json_file = File::open(json_path).unwrap();
|
||||
let lang_names: BTreeMap<String, String> =
|
||||
serde_json::from_reader(BufReader::new(json_file)).unwrap();
|
||||
|
||||
let code_head = r#"// This file is automatically generated. DO NOT EDIT.
|
||||
|
||||
//! Languages and countries
|
||||
|
||||
use std::str::FromStr;
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::error::Error;
|
||||
"#;
|
||||
|
||||
let code_foot = r#"serde_plain::derive_fromstr_from_deserialize!(Language, Error);
|
||||
let code_foot = r#"impl FromStr for Language {
|
||||
type Err = Error;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
let mut sub = s;
|
||||
loop {
|
||||
if let Ok(v) = serde_plain::from_str(sub) {
|
||||
return Ok(v);
|
||||
}
|
||||
match sub.rfind('-') {
|
||||
Some(pos) => {
|
||||
sub = &sub[..pos];
|
||||
}
|
||||
None => return Err(Error::Other("could not parse language `{s}`".into())),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
serde_plain::derive_display_from_serialize!(Language);
|
||||
|
||||
serde_plain::derive_fromstr_from_deserialize!(Country, Error);
|
||||
|
|
@ -199,8 +227,8 @@ pub enum Country {
|
|||
"#
|
||||
.to_owned();
|
||||
|
||||
languages.iter().for_each(|(c, n)| {
|
||||
let enum_name = c
|
||||
languages.iter().for_each(|(code, native_name)| {
|
||||
let enum_name = code
|
||||
.split('-')
|
||||
.map(|c| {
|
||||
format!(
|
||||
|
|
@ -211,10 +239,16 @@ pub enum Country {
|
|||
})
|
||||
.collect::<String>();
|
||||
|
||||
let en_name = lang_names.get(code).expect(code);
|
||||
|
||||
// Language enum
|
||||
write!(code_langs, " /// {n}\n ").unwrap();
|
||||
if c.contains('-') {
|
||||
write!(code_langs, "#[serde(rename = \"{c}\")]\n ").unwrap();
|
||||
if en_name == native_name || code.starts_with("en") {
|
||||
write!(code_langs, " /// {native_name}\n ").unwrap();
|
||||
} else {
|
||||
write!(code_langs, " /// {en_name} / {native_name}\n ").unwrap();
|
||||
}
|
||||
if code.contains('-') {
|
||||
write!(code_langs, "#[serde(rename = \"{code}\")]\n ").unwrap();
|
||||
}
|
||||
code_langs += &enum_name;
|
||||
code_langs += ",\n";
|
||||
|
|
@ -225,7 +259,7 @@ pub enum Country {
|
|||
// Language names
|
||||
writeln!(
|
||||
code_lang_names,
|
||||
" Language::{enum_name} => \"{n}\","
|
||||
" Language::{enum_name} => \"{native_name}\","
|
||||
)
|
||||
.unwrap();
|
||||
});
|
||||
|
|
|
|||
Reference in a new issue