private void generateAddOperationMiddleware()

in codegen/smithy-go-codegen/src/main/java/software/amazon/smithy/go/codegen/OperationGenerator.java [175:226]


    private void generateAddOperationMiddleware() {
        Symbol stackSymbol = SymbolUtils.createPointableSymbolBuilder("Stack", SmithyGoDependency.SMITHY_MIDDLEWARE)
                .build();

        writer.openBlock("func (c *Client) $L(stack $P, options Options) (err error) {", "}",
                getAddOperationMiddlewareFuncName(operationSymbol), stackSymbol,
                () -> {
                    generateOperationProtocolMiddlewareAdders();

                    // Populate middleware's from runtime client plugins
                    runtimeClientPlugins.forEach(runtimeClientPlugin -> {
                        if (!runtimeClientPlugin.matchesService(model, service)
                            && !runtimeClientPlugin.matchesOperation(model, service, operation)) {
                            return;
                        }

                        if (!runtimeClientPlugin.registerMiddleware().isPresent()) {
                            return;
                        }

                        MiddlewareRegistrar middlewareRegistrar = runtimeClientPlugin.registerMiddleware().get();
                        Collection<Symbol> functionArguments = middlewareRegistrar.getFunctionArguments();

                        if (middlewareRegistrar.getInlineRegisterMiddlewareStatement() != null) {
                            String registerStatement = String.format("if err = stack.%s",
                                    middlewareRegistrar.getInlineRegisterMiddlewareStatement());
                            writer.writeInline(registerStatement);
                            writer.writeInline("$T(", middlewareRegistrar.getResolvedFunction());
                            if (functionArguments != null) {
                                List<Symbol> args = new ArrayList<>(functionArguments);
                                for (Symbol arg : args) {
                                    writer.writeInline("$P, ", arg);
                                }
                            }
                            writer.writeInline(")");
                            writer.write(", $T); err != nil {\nreturn err\n}",
                                    middlewareRegistrar.getInlineRegisterMiddlewarePosition());
                        } else {
                            writer.writeInline("if err = $T(stack", middlewareRegistrar.getResolvedFunction());
                            if (functionArguments != null) {
                                List<Symbol> args = new ArrayList<>(functionArguments);
                                for (Symbol arg : args) {
                                    writer.writeInline(", $P", arg);
                                }
                            }
                            writer.write("); err != nil {\nreturn err\n}");
                        }
                    });

                    writer.write("return nil");
                });
    }