public void generateInternalDocumentTypes()

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("");
        });
    }