use serde::de::Error;
use serde::de::Unexpected;
use serde::de::Visitor;
use super::duration_payload_field::DurationPayloadField;
pub(super) struct DurationPayloadFieldVisitor;
impl<'de> Visitor<'de> for DurationPayloadFieldVisitor {
type Value = DurationPayloadField;
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 {
"secs" => Ok(DurationPayloadField::Secs),
"nanos" => Ok(DurationPayloadField::Nanos),
_ => Err(E::unknown_field(value, &["secs", "nanos"])),
}
}
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,
)),
}
}
}