protected void renderUriBuilder()

in codegen/smithy-ruby-codegen/src/main/java/software/amazon/smithy/ruby/codegen/generators/RestBuilderGeneratorBase.java [226:277]


    protected void renderUriBuilder(OperationShape operation, Shape inputShape) {
        String uri = getHttpUri(operation);
        // need to ensure that static query params in the uri are handled first
        // get a list of all of HttpLabel members
        String[] uriParts = uri.split("[?]");
        if (uriParts.length > 1) {
            uri = uriParts[0];
            writer
                    .openBlock("CGI.parse('$L').each do |k,v|", uriParts[1])
                    .write("v.each { |q_v| http_req.append_query_param(k, q_v) }")
                    .closeBlock("end");
        }

        List<MemberShape> labelMembers = inputShape.members()
                .stream()
                .filter((m) -> m.hasTrait(HttpLabelTrait.class))
                .collect(Collectors.toList());

        if (labelMembers.size() > 0) {
            Optional<String> greedyLabel = Optional.empty();
            Matcher greedyMatch = Pattern.compile("[{]([a-zA-Z0-9_]+)[+][}]").matcher(uri);
            if (greedyMatch.find()) {
                greedyLabel = Optional.of(greedyMatch.group(1));
                uri = greedyMatch.replaceAll("%<$1>s");
            }
            String formatUri = uri
                    .replaceAll("[{]([a-zA-Z0-9_]+)[}]", "%<$1>s");
            StringBuffer formatArgs = new StringBuffer();

            for (MemberShape m : labelMembers) {
                Shape target = model.expectShape(m.getTarget());
                if (greedyLabel.isPresent() && greedyLabel.get().equals(m.getMemberName())) {
                    formatArgs.append(
                            ",\n  " + m.getMemberName() + ": (" + target.accept(new LabelMemberSerializer(m))
                                    + ").split('/').map "
                                    + "{ |s| Seahorse::HTTP.uri_escape(s) }.join('/')"
                    );
                } else {
                    formatArgs.append(
                            ",\n  " + m.getMemberName() + ": Seahorse::HTTP.uri_escape("
                                    + target.accept(new LabelMemberSerializer(m)) + ")"
                    );
                }
                LOGGER.finest("Generated label for " + m.getMemberName());
            }
            writer.openBlock("http_req.append_path(format(");
            writer.write("  '$L'$L\n)", formatUri, formatArgs.toString());
            writer.closeBlock(")");
        } else {
            writer.write("http_req.append_path('$L')", uri);
        }
    }