use serde::de::Error;
use serde::de::Unexpected;
use serde::de::Visitor;
use super::big_decimal_payload_field::BigDecimalPayloadField;
pub(super) struct BigDecimalPayloadFieldVisitor;
impl<'de> Visitor<'de> for BigDecimalPayloadFieldVisitor {
type Value = BigDecimalPayloadField;
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 {
"coefficient" => Ok(BigDecimalPayloadField::Coefficient),
"scale" => Ok(BigDecimalPayloadField::Scale),
_ => Err(E::unknown_field(value, &["coefficient", "scale"])),
}
}
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)),
}
}
}