Skip to content

Commit 28f9b8d

Browse files
committed
fix: Recursively resolve references in anyOf
1 parent f49845a commit 28f9b8d

File tree

3 files changed

+83
-19
lines changed

3 files changed

+83
-19
lines changed

src/diff_walker.rs

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -350,29 +350,23 @@ impl<F: FnMut(Change)> DiffWalker<F> {
350350
Ok(())
351351
}
352352

353-
fn resolve_ref<'a>(root_schema: &'a RootSchema, reference: &str) -> Option<&'a Schema> {
354-
if let Some(definition_name) = reference.strip_prefix("#/definitions/") {
355-
let schema_object = root_schema.definitions.get(definition_name)?;
356-
Some(schema_object)
357-
} else {
358-
None
359-
}
360-
}
361-
362353
fn resolve_references(
363-
&mut self,
364-
lhs: &mut SchemaObject,
365-
rhs: &mut SchemaObject,
354+
root: &RootSchema,
355+
obj: &mut SchemaObject,
366356
) -> Result<(), Error> {
367-
if let Some(ref reference) = lhs.reference {
368-
if let Some(lhs_inner) = Self::resolve_ref(&self.lhs_root, reference) {
369-
*lhs = lhs_inner.clone().into_object();
357+
if let Some(ref reference) = obj.reference {
358+
if let Some(definition_name) = reference.strip_prefix("#/definitions/") {
359+
if let Some(schema_object) = root.definitions.get(definition_name) {
360+
*obj = schema_object.clone().into_object();
361+
}
370362
}
371363
}
372364

373-
if let Some(ref reference) = rhs.reference {
374-
if let Some(rhs_inner) = Self::resolve_ref(&self.rhs_root, reference) {
375-
*rhs = rhs_inner.clone().into_object();
365+
if let Some(ref mut any_of) = obj.subschemas().any_of {
366+
for subschema in any_of {
367+
if let Schema::Object(ref mut subobj) = subschema {
368+
Self::resolve_references(root, subobj)?;
369+
}
376370
}
377371
}
378372

@@ -459,7 +453,8 @@ impl<F: FnMut(Change)> DiffWalker<F> {
459453
lhs: &mut SchemaObject,
460454
rhs: &mut SchemaObject,
461455
) -> Result<(), Error> {
462-
self.resolve_references(lhs, rhs)?;
456+
Self::resolve_references(&self.lhs_root, lhs)?;
457+
Self::resolve_references(&self.rhs_root, rhs)?;
463458
let is_lhs_split = Self::split_types(lhs);
464459
let is_rhs_split = Self::split_types(rhs);
465460
self.diff_any_of(json_path, is_rhs_split, lhs, rhs)?;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"lhs": {},
3+
"rhs": {
4+
"anyOf": [
5+
{
6+
"$ref": "#/definitions/myobject"
7+
},
8+
{
9+
"$ref": "#/definitions/myarray"
10+
}
11+
],
12+
"definitions": {
13+
"myobject": {
14+
"type": "object"
15+
},
16+
"myarray": {
17+
"type": "array"
18+
}
19+
}
20+
}
21+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
---
2+
source: tests/test.rs
3+
expression: diff
4+
info:
5+
lhs: {}
6+
rhs:
7+
anyOf:
8+
- $ref: "#/definitions/myobject"
9+
- $ref: "#/definitions/myarray"
10+
definitions:
11+
myarray:
12+
type: array
13+
myobject:
14+
type: object
15+
input_file: tests/fixtures/events-diff/test1.json
16+
---
17+
[
18+
Change {
19+
path: "",
20+
change: TypeRemove {
21+
removed: String,
22+
},
23+
},
24+
Change {
25+
path: "",
26+
change: TypeRemove {
27+
removed: Number,
28+
},
29+
},
30+
Change {
31+
path: "",
32+
change: TypeRemove {
33+
removed: Integer,
34+
},
35+
},
36+
Change {
37+
path: "",
38+
change: TypeRemove {
39+
removed: Boolean,
40+
},
41+
},
42+
Change {
43+
path: "",
44+
change: TypeRemove {
45+
removed: Null,
46+
},
47+
},
48+
]

0 commit comments

Comments
 (0)