use serde::de::Error;
use serde::de::Unexpected;
use serde::de::Visitor;
use super::named_value_field::NamedValueField;
pub(super) struct NamedValueFieldVisitor;
impl<'de> Visitor<'de> for NamedValueFieldVisitor {
type Value = NamedValueField;
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str("a string")
}
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
where
E: Error,
{
match value {
"name" => Ok(NamedValueField::Name),
"value" => Ok(NamedValueField::Value),
_ => Err(E::unknown_field(value, &["name", "value"])),
}
}
fn visit_borrowed_str<E>(self, value: &'de str) -> Result<Self::Value, E>
where
E: Error,
{
self.visit_str(value)
}
fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
where
E: Error,
{
self.visit_str(&value)
}
fn visit_bytes<E>(self, value: &[u8]) -> Result<Self::Value, E>
where
E: Error,
{
match std::str::from_utf8(value) {
Ok(value) => self.visit_str(value),
Err(_) => Err(E::invalid_value(Unexpected::Bytes(value), &self)),
}
}
fn visit_byte_buf<E>(self, value: Vec<u8>) -> Result<Self::Value, E>
where
E: Error,
{
match String::from_utf8(value) {
Ok(value) => self.visit_str(&value),
Err(error) => Err(E::invalid_value(
Unexpected::Bytes(&error.into_bytes()),
&self,
)),
}
}
}