mod data;
mod error;
mod parser;
mod region;
mod trie;
pub use error::ParseError;
pub use parser::AddressParser;
pub use region::{ParsedAddress, Region};
pub fn parse(address: &str) -> ParsedAddress {
AddressParser::global().parse(address)
}
pub fn normalize(
province: impl AsRef<str>,
city: impl AsRef<str>,
district: Option<&str>,
) -> String {
AddressParser::global().normalize(province, city, district)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_full_address() {
let parser = AddressParser::new();
let result = parser.parse("广东省深圳市南山区科技园路1号");
assert_eq!(result.province, Some("广东省".to_string()));
assert_eq!(result.city, Some("深圳市".to_string()));
assert_eq!(result.district, Some("南山区".to_string()));
assert_eq!(result.detail, "科技园路1号");
}
#[test]
fn test_parse_short_name() {
let parser = AddressParser::new();
let result = parser.parse("深圳南山科技园");
assert_eq!(result.province, Some("广东省".to_string()));
assert_eq!(result.city, Some("深圳市".to_string()));
assert_eq!(result.district, Some("南山区".to_string()));
}
#[test]
fn test_parse_municipality() {
let parser = AddressParser::new();
let result = parser.parse("北京市朝阳区望京");
assert_eq!(result.province, Some("北京市".to_string()));
assert_eq!(result.city, Some("北京市".to_string()));
assert_eq!(result.district, Some("朝阳区".to_string()));
}
#[test]
fn test_normalize() {
let parser = AddressParser::new();
assert_eq!(
parser.normalize("广东", "深圳", Some("南山")),
"广东省深圳市南山区"
);
assert_eq!(parser.normalize("广东省", "深圳市", None), "广东省深圳市");
assert_eq!(
parser.normalize("北京", "北京", Some("朝阳")),
"北京市北京市朝阳区"
);
}
}