pub trait CodeListValue: Sized {
const CODE_SPACE: &'static str;
fn from_code_value(value: &str) -> Self;
fn to_code_value(&self) -> &str;
}
#[macro_export]
macro_rules! code_list_value_wrapper {
($name:ident, $doc:literal) => {
#[doc = $doc]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct $name(egml::model::basic_types::Code);
impl $name {
pub fn code(&self) -> &egml::model::basic_types::Code {
&self.0
}
pub fn value(&self) -> &str {
&self.code().value()
}
pub fn into_code(self) -> egml::model::basic_types::Code {
self.0
}
pub fn interpret<T: $crate::model::common::CodeListValue>(&self) -> Option<T> {
let matches = self.0.code_space().is_none_or(|cs| cs == T::CODE_SPACE);
matches.then(|| T::from_code_value(self.0.value()))
}
pub fn from_value<T: $crate::model::common::CodeListValue>(value: &T) -> Self {
Self(egml::model::basic_types::Code::with_code_space(
T::CODE_SPACE,
value.to_code_value(),
))
}
}
impl From<egml::model::basic_types::Code> for $name {
fn from(code: egml::model::basic_types::Code) -> Self {
Self(code)
}
}
};
}