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