in codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/ProtocolDocumentGenerator.java [286:354]
public void generateInternalDocumentTypes(ProtocolGenerator protocolGenerator, GenerationContext context) {
if (!this.hasDocumentShapes) {
return;
}
writeInternalDocumentPackage("document.go", writer -> {
Symbol marshalerSymbol = getInternalDocumentSymbol("documentMarshaler",
true);
Symbol unmarshalerSymbol = getInternalDocumentSymbol("documentUnmarshaler", true);
Symbol isDocumentInterface = getInternalDocumentSymbol(INTERNAL_IS_DOCUMENT_INTERFACE);
writeInternalDocumentImplementation(
writer,
marshalerSymbol,
() -> {
protocolGenerator.generateProtocolDocumentMarshalerUnmarshalDocument(context.toBuilder()
.writer(writer)
.build());
},
() -> {
protocolGenerator.generateProtocolDocumentMarshalerMarshalDocument(context.toBuilder()
.writer(writer)
.build());
});
writeInternalDocumentImplementation(writer,
unmarshalerSymbol,
() -> {
protocolGenerator.generateProtocolDocumentUnmarshalerUnmarshalDocument(context.toBuilder()
.writer(writer)
.build());
},
() -> {
protocolGenerator.generateProtocolDocumentUnmarshalerMarshalDocument(context.toBuilder()
.writer(writer)
.build());
});
Symbol documentInterfaceSymbol = getInternalDocumentSymbol(DOCUMENT_INTERFACE_NAME);
writer.writeDocs(String.format("%s creates a new document marshaler for the given input type",
INTERNAL_NEW_DOCUMENT_MARSHALER_FUNC));
writer.openBlock("func $L(v interface{}) $T {", "}", INTERNAL_NEW_DOCUMENT_MARSHALER_FUNC,
documentInterfaceSymbol, () -> {
protocolGenerator.generateNewDocumentMarshaler(context.toBuilder()
.writer(writer)
.build(), marshalerSymbol);
}).write("");
writer.writeDocs(String.format("%s creates a new document unmarshaler for the given service response",
INTERNAL_NEW_DOCUMENT_UNMARSHALER_FUNC));
writer.openBlock("func $L(v interface{}) $T {", "}", INTERNAL_NEW_DOCUMENT_UNMARSHALER_FUNC,
documentInterfaceSymbol, () -> {
protocolGenerator.generateNewDocumentUnmarshaler(context.toBuilder()
.writer(writer)
.build(), unmarshalerSymbol);
}).write("");
writer.writeDocs(String.format("%s returns whether the given Interface implementation is"
+ " a valid client implementation", isDocumentInterface));
writer.openBlock("func $T(v Interface) (ok bool) {", "}", isDocumentInterface, () -> {
writer.openBlock("defer func() {", "}()", () -> {
writer.openBlock("if err := recover(); err != nil {", "}", () -> writer.write("ok = false"));
});
writer.write("v.$L()", IS_SMITHY_DOCUMENT_METHOD);
writer.write("return true");
}).write("");
});
}