1mod data;
37mod error;
38mod parser;
39mod region;
40mod trie;
41
42pub use error::ParseError;
43pub use parser::AddressParser;
44pub use region::{ParsedAddress, Region};
45
46pub fn parse(address: &str) -> ParsedAddress {
53 AddressParser::global().parse(address)
54}
55
56pub fn normalize(
63 province: impl AsRef<str>,
64 city: impl AsRef<str>,
65 district: Option<&str>,
66) -> String {
67 AddressParser::global().normalize(province, city, district)
68}
69
70#[cfg(test)]
71mod tests {
72 use super::*;
73
74 #[test]
75 fn test_parse_full_address() {
76 let parser = AddressParser::new();
77 let result = parser.parse("广东省深圳市南山区科技园路1号");
78
79 assert_eq!(result.province, Some("广东省".to_string()));
80 assert_eq!(result.city, Some("深圳市".to_string()));
81 assert_eq!(result.district, Some("南山区".to_string()));
82 assert_eq!(result.detail, "科技园路1号");
83 }
84
85 #[test]
86 fn test_parse_short_name() {
87 let parser = AddressParser::new();
88 let result = parser.parse("深圳南山科技园");
89
90 assert_eq!(result.province, Some("广东省".to_string()));
91 assert_eq!(result.city, Some("深圳市".to_string()));
92 assert_eq!(result.district, Some("南山区".to_string()));
93 }
94
95 #[test]
96 fn test_parse_municipality() {
97 let parser = AddressParser::new();
98 let result = parser.parse("北京市朝阳区望京");
99
100 assert_eq!(result.province, Some("北京市".to_string()));
101 assert_eq!(result.city, Some("北京市".to_string()));
102 assert_eq!(result.district, Some("朝阳区".to_string()));
103 }
104
105 #[test]
106 fn test_normalize() {
107 let parser = AddressParser::new();
108
109 assert_eq!(
110 parser.normalize("广东", "深圳", Some("南山")),
111 "广东省深圳市南山区"
112 );
113 assert_eq!(parser.normalize("广东省", "深圳市", None), "广东省深圳市");
114 assert_eq!(
115 parser.normalize("北京", "北京", Some("朝阳")),
116 "北京市北京市朝阳区"
117 );
118 }
119}