diff --git a/types/src/response.rs b/types/src/response.rs index 9522231cd0..bf60e911b9 100644 --- a/types/src/response.rs +++ b/types/src/response.rs @@ -168,7 +168,7 @@ impl<'a, T: Clone> ResponsePayload<'a, T> { Self::Error(e.into()) } - /// Create a borrowd error response payload. + /// Create a borrowed error response payload. pub fn error_borrowed(e: impl Into>) -> Self { Self::Error(e.into()) } @@ -189,11 +189,13 @@ where D: Deserializer<'de>, T: Deserialize<'de> + Clone, { + #[derive(Debug)] enum Field { Jsonrpc, Result, Error, Id, + Ignore, } impl<'de> Deserialize<'de> for Field { @@ -219,7 +221,7 @@ where "result" => Ok(Field::Result), "error" => Ok(Field::Error), "id" => Ok(Field::Id), - _ => Err(serde::de::Error::unknown_field(value, FIELDS)), + _ => Ok(Field::Ignore), } } } @@ -279,6 +281,9 @@ where } jsonrpc = Some(map.next_value()?); } + Field::Ignore => { + let _ = map.next_value::()?; + } } } @@ -405,4 +410,14 @@ mod tests { assert_eq!(dsr.payload, exp.payload); assert_eq!(dsr.id, exp.id); } + + #[test] + fn deserialize_with_unknown_field() { + let exp = Response { jsonrpc: None, payload: ResponsePayload::success(99_u64), id: Id::Number(11) }; + let dsr: Response = + serde_json::from_str(r#"{"jsonrpc":null, "result":99, "id":11, "unknown":11}"#).unwrap(); + assert_eq!(dsr.jsonrpc, exp.jsonrpc); + assert_eq!(dsr.payload, exp.payload); + assert_eq!(dsr.id, exp.id); + } }