Skip to content

Commit 9074afc

Browse files
committed
Support sparse lists and maps in MCP
1 parent 356d2f2 commit 9074afc

File tree

5 files changed

+676
-29
lines changed

5 files changed

+676
-29
lines changed

core/src/main/java/software/amazon/smithy/java/core/serde/document/DocumentParser.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,16 @@ public <T> void writeList(Schema schema, T state, int size, BiConsumer<T, ShapeS
9797
elementParser.result = null;
9898
}
9999
});
100+
var schemaToUse = schema;
101+
if (schema.type() == ShapeType.DOCUMENT) {
102+
schemaToUse = Documents.LIST_SCHEMA;
103+
}
100104
consumer.accept(state, serializer);
101105
// Note that neither here nor between values are we testing to ensure the value is not null. That's because
102106
// this method is used primarily with documents that have no schema, and therefore cannot specify that a
103107
// list is sparse. Rather than drop null values, they are retained.
104108
elements.add(elementParser.result);
105-
setResult(new Documents.ListDocument(schema, elements));
109+
setResult(new Documents.ListDocument(schemaToUse, elements));
106110
}
107111

108112
@Override

core/src/main/java/software/amazon/smithy/java/core/serde/document/Documents.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,13 @@ public void serializeContents(ShapeSerializer serializer) {
231231
serializer.writeMap(schema, members, members.size(), (members, s) -> {
232232
var key = schema.mapKeyMember();
233233
for (var entry : members.entrySet()) {
234-
s.writeEntry(key, entry.getKey(), entry.getValue(), Document::serialize);
234+
s.writeEntry(key, entry.getKey(), entry.getValue(), (doc, ser) -> {
235+
if (doc == null) {
236+
ser.writeNull(schema.mapValueMember());
237+
} else {
238+
doc.serialize(ser);
239+
}
240+
});
235241
}
236242
});
237243
}

0 commit comments

Comments
 (0)