use serde::Deserialize;
use std::collections::HashMap;
use crate::error::ParseError;
#[derive(Debug, Deserialize, Clone)]
pub struct CountryInfo {
pub alpha2: String,
pub alpha3: String,
pub name_en: String,
pub name_zh_cn: String,
pub name_zh_tw: String,
pub abbreviations: Vec<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ParserSettings {
pub case_sensitive: bool,
pub fuzzy_match: bool,
pub timeout_ms: u64,
}
#[derive(Debug, Deserialize, Clone)]
pub struct PatternConfig {
pub prefix_patterns: Vec<String>,
pub suffix_patterns: Vec<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct CountriesConfig {
pub version: String,
pub countries: Vec<CountryInfo>,
}
#[derive(Debug, Clone)]
pub struct Configuration {
pub countries_config: CountriesConfig,
pub patterns: PatternConfig,
pub settings: ParserSettings,
}
impl Configuration {
pub fn load() -> Result<Self, ParseError> {
let countries_str = include_str!("../resources/countries.json");
let countries_config: CountriesConfig = serde_json::from_str(countries_str)
.map_err(|e| ParseError::config_error(&format!("国家配置解析失败: {}", e)))?;
let patterns_str = include_str!("../resources/patterns.json");
let patterns: PatternConfig = serde_json::from_str(patterns_str)
.map_err(|e| ParseError::config_error(&format!("模式配置解析失败: {}", e)))?;
let settings_str = include_str!("../resources/settings.json");
let settings: ParserSettings = serde_json::from_str(settings_str)
.map_err(|e| ParseError::config_error(&format!("设置配置解析失败: {}", e)))?;
Ok(Configuration {
countries_config,
patterns,
settings,
})
}
pub fn create_country_mapping(&self) -> HashMap<String, &CountryInfo> {
let mut mapping = HashMap::new();
for country in &self.countries_config.countries {
mapping.insert(country.alpha2.clone(), country);
mapping.insert(country.alpha3.clone(), country);
mapping.insert(country.name_en.clone(), country);
mapping.insert(country.name_zh_cn.clone(), country);
mapping.insert(country.name_zh_tw.clone(), country);
for abbr in &country.abbreviations {
mapping.insert(abbr.clone(), country);
}
}
mapping
}
pub fn get_settings(&self) -> &ParserSettings {
&self.settings
}
pub fn get_patterns(&self) -> &PatternConfig {
&self.patterns
}
pub fn get_countries(&self) -> &[CountryInfo] {
&self.countries_config.countries
}
pub fn get_version(&self) -> &str {
&self.countries_config.version
}
}