Commit 516c4f0b authored by Chunchi Che's avatar Chunchi Che

Merge branch 'feat/strings.conf' into 'main'

Feat/strings.conf

See merge request !6
parents 9986628a 7a7c972d
Pipeline #18772 passed with stages
in 7 minutes and 22 seconds
...@@ -11,6 +11,11 @@ const SERVE_ADDR: &str = "127.0.0.1:3030"; ...@@ -11,6 +11,11 @@ const SERVE_ADDR: &str = "127.0.0.1:3030";
async fn main() -> anyhow::Result<()> { async fn main() -> anyhow::Result<()> {
pretty_env_logger::try_init()?; pretty_env_logger::try_init()?;
let workspace = env!("CARGO_MANIFEST_DIR");
let strings_manager = service::strings_conf_reader(format!(
"{workspace}/ygopro-database/locales/zh-CN/strings.conf"
))?;
// TODO: use CORS correctly // TODO: use CORS correctly
let cors = warp::cors() let cors = warp::cors()
.allow_any_origin() .allow_any_origin()
...@@ -27,12 +32,16 @@ async fn main() -> anyhow::Result<()> { ...@@ -27,12 +32,16 @@ async fn main() -> anyhow::Result<()> {
.map(service::cards_service) .map(service::cards_service)
.with(cors.clone()); .with(cors.clone());
let strings = warp::path!("strings" / String)
.map(service::strings_service(strings_manager))
.with(cors.clone());
// TODO: 模块化 // TODO: 模块化
let images = warp::path("images") let images = warp::path("images")
.and(warp::fs::dir("./images/")) .and(warp::fs::dir("./images/"))
.with(cors); .with(cors);
warp::serve(deck.or(cards).or(images)) warp::serve(deck.or(cards).or(images).or(strings))
.run(SocketAddr::from_str(SERVE_ADDR)?) .run(SocketAddr::from_str(SERVE_ADDR)?)
.await; .await;
......
mod cards; mod cards;
mod deck; mod deck;
mod strings;
pub use cards::service as cards_service; pub use cards::service as cards_service;
pub use deck::service as deck_service; pub use deck::service as deck_service;
pub use strings::{service_maker as strings_service, strings_conf_reader};
use std::{
collections::HashMap,
fs::File,
io::{BufRead, BufReader},
path::Path,
};
type StringsManager = HashMap<String, HashMap<i64, String>>;
// TODO: `strings_manager`应该做好持久化存储
pub fn service_maker(strings_manager: StringsManager) -> impl Fn(String) -> String + Clone {
move |param| {
// TODO:应该做好错误处理
let (r#type, code) = param.split_once('_').unwrap_or_default();
let code = code.parse::<i64>().unwrap_or_default();
strings_manager
.get(r#type)
.map_or(Some("".to_string()), |hash| hash.get(&code).cloned())
.unwrap_or_default()
}
}
pub fn strings_conf_reader(path: impl AsRef<Path>) -> anyhow::Result<StringsManager> {
let f = File::open(path)?;
let reader = BufReader::new(f);
let mut results: StringsManager = HashMap::new();
for line in reader.lines() {
let line = line?;
if !line.starts_with('#') {
if let Some((r#type, left)) = line.split_once(' ') {
if let Some((code, s)) = left.split_once(' ') {
results
.entry(r#type.to_string())
.or_default()
.insert(parse_code(code)?, s.to_string());
}
}
}
}
Ok(results)
}
fn parse_code(code: &str) -> anyhow::Result<i64> {
if code.starts_with("0x") {
let without_prefix = code.trim_start_matches("0x");
Ok(i64::from_str_radix(without_prefix, 16)?)
} else {
Ok(code.parse()?)
}
}
#[cfg(test)]
mod tests {
use super::strings_conf_reader;
#[test]
fn test_strings_conf_reader() {
let workspace = env!("CARGO_MANIFEST_DIR");
let strings_manager = strings_conf_reader(format!(
"{workspace}/ygopro-database/locales/zh-CN/strings.conf"
))
.unwrap_or_default();
assert_eq!(
strings_manager.get("!system").unwrap().get(&100).unwrap(),
"先攻"
);
assert_eq!(
strings_manager.get("!counter").unwrap().get(&0x56).unwrap(),
"炎星指示物"
);
assert_eq!(
strings_manager
.get("!setname")
.unwrap()
.get(&0x3008)
.unwrap(),
"元素英雄 E・HERO"
);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment