Fix reference JSON deserialization.

This commit is contained in:
KtorZ 2023-04-07 17:38:37 +02:00
parent c18deecdc8
commit bf222a3ea2
No known key found for this signature in database
GPG Key ID: 33173CB6F77F4277
2 changed files with 19 additions and 12 deletions

View File

@ -224,9 +224,16 @@ impl<'a> Deserialize<'a> for Reference {
} }
} }
Ok(Reference { let inner: String = inner.ok_or_else(|| de::Error::missing_field(FIELDS[0]))?;
inner: inner.ok_or_else(|| de::Error::missing_field(FIELDS[0]))?,
}) match inner.strip_prefix("#/definitions/") {
Some(suffix) => Ok(Reference {
inner: suffix.to_string(),
}),
None => Err(de::Error::custom(
"Invalid reference; only local JSON pointer to #/definitions are allowed.",
)),
}
} }
} }

View File

@ -1244,7 +1244,7 @@ pub mod test {
Data::List(Items::One(Declaration::Referenced(Reference::new("foo")))), Data::List(Items::One(Declaration::Referenced(Reference::new("foo")))),
serde_json::from_value(json!({ serde_json::from_value(json!({
"dataType": "list", "dataType": "list",
"items": { "$ref": "foo" } "items": { "$ref": "#/definitions/foo" }
})) }))
.unwrap() .unwrap()
) )
@ -1260,8 +1260,8 @@ pub mod test {
serde_json::from_value(json!({ serde_json::from_value(json!({
"dataType": "list", "dataType": "list",
"items": [ "items": [
{ "$ref": "foo" }, { "$ref": "#/definitions/foo" },
{ "$ref": "bar" } { "$ref": "#/definitions/bar" }
], ],
})) }))
.unwrap() .unwrap()
@ -1277,8 +1277,8 @@ pub mod test {
), ),
serde_json::from_value(json!({ serde_json::from_value(json!({
"dataType": "map", "dataType": "map",
"keys": { "$ref": "foo" }, "keys": { "$ref": "#/definitions/foo" },
"values": { "$ref": "bar" } "values": { "$ref": "#/definitions/bar" }
})) }))
.unwrap() .unwrap()
) )
@ -1300,10 +1300,10 @@ pub mod test {
"index": 0, "index": 0,
"fields": [ "fields": [
{ {
"$ref": "foo", "$ref": "#/definitions/foo",
}, },
{ {
"$ref": "bar", "$ref": "#/definitions/bar",
} }
] ]
}] }]
@ -1328,10 +1328,10 @@ pub mod test {
"index": 0, "index": 0,
"fields": [ "fields": [
{ {
"$ref": "foo", "$ref": "#/definitions/foo",
}, },
{ {
"$ref": "bar", "$ref": "#/definitions/bar",
} }
] ]
}] }]