use crate::city::{City, PublicCity};
use serde::{Deserialize, Serialize};
use strum::EnumIs;
#[derive(Clone, Debug, Default, Deserialize, Serialize, EnumIs)]
#[serde(tag = "kind", rename_all = "kebab-case")]
#[cfg_attr(feature = "typescript", derive(ts_rs::TS))]
pub enum Field {
#[default]
Empty,
City {
city: Box<City>,
},
}
impl Field {
#[inline]
pub fn city(&self) -> Option<&City> {
if let Self::City { city } = self { Some(city) } else { None }
}
pub(super) fn city_mut(&mut self) -> Option<&mut City> {
if let Self::City { city } = self { Some(city) } else { None }
}
}
impl From<City> for Field {
fn from(city: City) -> Self {
Self::City { city: Box::new(city) }
}
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, EnumIs)]
#[serde(tag = "kind", rename_all = "kebab-case")]
#[cfg_attr(feature = "typescript", derive(ts_rs::TS))]
pub enum PublicField {
#[default]
Empty,
City {
city: PublicCity,
},
}
impl From<&Field> for PublicField {
fn from(field: &Field) -> Self {
match field {
Field::Empty => Self::Empty,
Field::City { city } => Self::City { city: PublicCity::from(&**city) },
}
}
}