INNER CODE UNIT · Rust
deserialize_enum_or_unknown
stepancheg/rust-protobuf · protobuf-examples/customize-serde/src/lib.rs:36
fn deserialize_enum_or_unknown<'de, E: EnumFull, D: serde::Deserializer<'de>>(
d: D,
) -> Result<Option<EnumOrUnknown<E>>, D::Error> {
struct DeserializeEnumVisitor<E: EnumFull>(PhantomData<E>);
impl<'de, E: EnumFull> serde::de::Visitor<'de> for DeserializeEnumVisitor<E> {
type Value = Option<EnumOrUnknown<E>>;
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
write!(formatter, "a string, an integer or none")
}
fn visit_str<R>(self, v: &str) -> Result<Self::Value, R>
where
R: serde::de::Error,
{
match E::enum_descriptor().value_by_name(v) {
Some(v) => Ok(Some(EnumOrUnknown::from_i32(v.value()))),