address_formatter/
place.rs1use enum_map::{Enum, EnumMap};
2use serde::Serialize;
3use strum_macros::{Display, EnumIter, EnumString};
4
5#[derive(Enum, EnumString, Debug, Clone, EnumIter, Copy, Hash, Display, Eq, PartialEq)]
7#[strum(serialize_all = "snake_case")]
8pub enum Component {
9 Attention,
11 HouseNumber,
13 House,
15 Road,
17 Village,
19 Suburb,
21 City,
23 County,
25 CountyCode,
27 Postcode,
29 StateDistrict,
31 State,
33 StateCode,
35 Region,
37 Island,
39 Neighbourhood,
41 Country,
43 CountryCode,
45 Continent,
47 Town,
49 CityDistrict,
51}
52
53impl serde::Serialize for Component {
54 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
55 where
56 S: ::serde::Serializer,
57 {
58 self.to_string().serialize(serializer)
59 }
60}
61
62#[derive(Debug, Default, Serialize)]
67pub struct Place(EnumMap<Component, Option<String>>);
68
69impl std::ops::Deref for Place {
70 type Target = EnumMap<Component, Option<String>>;
71 fn deref(&self) -> &Self::Target {
72 &self.0
73 }
74}
75impl std::ops::DerefMut for Place {
76 fn deref_mut(&mut self) -> &mut EnumMap<Component, Option<String>> {
77 &mut self.0
78 }
79}
80
81impl<'a, T> From<T> for Place
82where
83 T: IntoIterator<Item = (Component, &'a str)>,
84{
85 fn from(data: T) -> Self {
86 let mut a = Self::default();
87 for (k, v) in data.into_iter() {
88 a[k] = Some(v.to_owned());
89 }
90 a
91 }
92}