(не число, а, например, строку) и обратно? Проще, наверное, будет на примере:
enum E {
A,
B,
}
impl E {
fn from_str(s: &str) -> Option<Self> {
match s {
"eee" => Some(Self::A),
"z" => Some(Self::B),
_ => None,
}
}
fn as_str(&self) -> &'static str {
match self {
Self::A => "eee",
Self::B => "z",
}
}
}
То есть, enum без данных и строки никак не связаны с названием вариантов. Так-то и руками написать несложно, но не нравится дублирование. Можно завернуть в макрос, но наверняка есть что-то готовое.
Нет готового.
serde + serde(rename = "") ?
Вопрос, какой фронтенд использовать в таком случае
Ну ладно, буду велосипедить.
trait StringAssoc { fn from_str(s: &str) -> Option<Self>; fn as_str(&self) -> &'static str; } macro_rules! impl_str_assoc { (enum $enum:ty { $($var:ident = $str:expr ;)* }) => { impl StringAssoc for $enum { #[inline] fn from_str(s: &str) { match s { $( $str => Some(Self::$var), )* _ => None, } } #[inline] fn as_str(&self) -> &'static str { match self { $( Self::$var => $str, )* } } } }; }
strum?
Спасибо, EnumString оттуда выглядит как то, что нужно.
Обсуждают сегодня