Я пытаюсь написать десериализатор, который может работать как со строковыми, так и с целочисленными входными значениями.Но происходит сбой, когда ввод является целым числом.
#[derive(Serialize, Queryable, Clone, Debug)]
#[cfg_attr(test, derive(Default))]
pub struct Obj {
pub id: i32,
pub name: String,
}
impl<'de> Deserialize<'de> for Obj {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
struct VariantVisitor;
impl<'de> Visitor<'de> for ObjVisitor {
type Value = Obj;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("valid obj_id")
}
fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
where
E: de::Error,
{
get_obj(value as i32).ok_or(E::custom("invalid obj id"))
}
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
where
E: de::Error,
{
match get_id(value, "xyz") {
Ok(id) => self.visit_i64(id as i64),
Err(_) => Err(E::custom("invalid value")),
}
}
}
deserializer.deserialize_identifier(VariantVisitor)
}
}
Когда ввод является {'obj': 1}
, при десериализации я получаю
Ошибка: недопустимый тип: целое число 1
,Ожидаемый действительный obj_id,
Когда ввод {'obj': "1"}
, он работает отлично.