Skip to content

Commit 102f86f

Browse files
committed
Impl Division::search()
1 parent 529561f commit 102f86f

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

src/lib.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,32 @@ impl Division {
3737
})
3838
}
3939

40+
/// Searches administrative division by its code in all revision
41+
pub fn search(code: &str) -> Option<Self> {
42+
fn parse_rev_year(rev: &str) -> u32 {
43+
let parts: Vec<&str> = rev.split('-').collect();
44+
if parts.len() == 2 {
45+
parts[1].parse().unwrap()
46+
} else {
47+
rev.parse().unwrap()
48+
}
49+
}
50+
51+
let mut revisions = Self::revisions();
52+
revisions.sort_unstable_by(|a, b| {
53+
let year_a = parse_rev_year(a);
54+
let year_b = parse_rev_year(b);
55+
year_b.cmp(&year_a)
56+
});
57+
for rev in revisions {
58+
let division = Self::get_by_revision(code, rev);
59+
if division.is_some() {
60+
return division;
61+
}
62+
}
63+
None
64+
}
65+
4066
/// List all revisions supported by GB2260
4167
pub fn revisions() -> Vec<&'static str> {
4268
DIVISIONS.keys().cloned().collect()
@@ -126,5 +152,9 @@ mod tests {
126152
assert!(!division.is_prefecture());
127153
assert!(division.is_county());
128154
assert_eq!(division.stack().len(), 3);
155+
156+
let division_search = Division::search("110000").unwrap();
157+
let division_get = Division::get("110000").unwrap();
158+
assert_eq!(division_search, division_get);
129159
}
130160
}

0 commit comments

Comments
 (0)