fix: improve language docs + string parsing

This commit is contained in:
ThetaDev 2023-05-11 17:00:01 +02:00
parent 86775ea95b
commit e184341625
6 changed files with 255 additions and 92 deletions

View file

@ -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();
});