allow Entity to be deserialized with serde_json (#3873)

# Objective

- `serde_json` assumes that numbers being deserialized are either u64 or i64.
- `Entity` serializes and deserializes as a u32.
- Deserializing an `Entity` with `serde_json` fails with: `Error("invalid type: integer 10947, expected expected Entity"`

## Solution

- Implemented a visitor for u64 that allows an `Entity` to be deserialized in this case.
- While I was here, also fixed the redundant "expected expected Entity" in the error message
- Tested the change in a local project which now correctly deserializes `Entity` structs with `serde_json` when it couldn't before
This commit is contained in:
Delphine 2022-02-06 04:16:16 +00:00
parent 75286b8540
commit b13f238fc7

View File

@ -25,7 +25,7 @@ impl<'de> Visitor<'de> for EntityVisitor {
type Value = Entity;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("expected Entity")
formatter.write_str("Entity")
}
fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
@ -34,4 +34,11 @@ impl<'de> Visitor<'de> for EntityVisitor {
{
Ok(Entity::from_raw(v))
}
fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Ok(Entity::from_raw(v as u32))
}
}