use std::fmt;
use serde::de::{self};
use serde::{Deserialize, Deserializer, Serialize};
#[derive(Serialize, Debug)]
pub(crate) enum ContextEntryValue {
Base(String),
Plain(String),
}
impl<'de> Deserialize<'de> for ContextEntryValue {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct ContextEntryValueVisitor;
impl<'de> de::Visitor<'de> for ContextEntryValueVisitor {
type Value = ContextEntryValue;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("ContextEntryValue")
}
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
where
E: de::Error,
{
Ok(ContextEntryValue::Plain(value.to_string()))
}
fn visit_map<V>(self, mut map: V) -> Result<Self::Value, V::Error>
where
V: de::MapAccess<'de>,
{
if let Some("@base") = map.next_key()? {
let value: String = map.next_value()?;
Ok(ContextEntryValue::Base(value))
} else {
Err(de::Error::missing_field("@base"))
}
}
}
deserializer.deserialize_any(ContextEntryValueVisitor {})
}
}