Skip to content

Commit c68ccc1

Browse files
Support endpoint deser
1 parent d572736 commit c68ccc1

File tree

1 file changed

+45
-7
lines changed

1 file changed

+45
-7
lines changed

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import software.amazon.smithy.model.traits.ErrorTrait;
5959
import software.amazon.smithy.model.traits.EventHeaderTrait;
6060
import software.amazon.smithy.model.traits.EventPayloadTrait;
61+
import software.amazon.smithy.model.traits.HostLabelTrait;
6162
import software.amazon.smithy.model.traits.HttpErrorTrait;
6263
import software.amazon.smithy.model.traits.HttpTrait;
6364
import software.amazon.smithy.model.traits.MediaTypeTrait;
@@ -1105,7 +1106,6 @@ private void generateOperationRequestDeserializer(
11051106
+ " output: $T,\n"
11061107
+ " context: $L\n"
11071108
+ "): Promise<$T> => {", "}", methodName, requestType, contextType, inputType, () -> {
1108-
// TODO: deserialize endpoint
11091109
// Start deserializing the response.
11101110
writer.openBlock("const contents: $T = {", "};", inputType, () -> {
11111111
// Only set a type and the members if we have output.
@@ -1119,6 +1119,7 @@ private void generateOperationRequestDeserializer(
11191119
});
11201120
readQueryString(context, operation, bindingIndex);
11211121
readPath(context, operation, bindingIndex, trait);
1122+
readHost(context, operation);
11221123
readRequestHeaders(context, operation, bindingIndex, "output");
11231124
List<HttpBinding> documentBindings = readRequestBody(context, operation, bindingIndex);
11241125
// Track all shapes bound to the document so their deserializers may be generated.
@@ -1178,13 +1179,50 @@ private void readPath(
11781179
}
11791180
writer.write("const pathRegex = new RegExp($S);", pathRegexBuilder.toString());
11801181
writer.write("const parsedPath: RegExpMatchArray = output.endpoint.path.match(pathRegex);");
1181-
for (HttpBinding binding : pathBindings) {
1182-
Shape target = context.getModel().expectShape(binding.getMember().getTarget());
1183-
String memberName = context.getSymbolProvider().toMemberName(binding.getMember());
1184-
String labelValue = getOutputValue(context, binding.getLocation(),
1185-
"parsedPath.groups." + binding.getLocationName(), binding.getMember(), target);
1186-
writer.write("contents.$L = $L;", memberName, labelValue);
1182+
writer.openBlock("if (parsedPath.groups !== undefined) {", "}", () -> {
1183+
for (HttpBinding binding : pathBindings) {
1184+
Shape target = context.getModel().expectShape(binding.getMember().getTarget());
1185+
String memberName = context.getSymbolProvider().toMemberName(binding.getMember());
1186+
String labelValue = getOutputValue(context, binding.getLocation(),
1187+
"parsedPath.groups." + binding.getLocationName(), binding.getMember(), target);
1188+
writer.write("contents.$L = $L;", memberName, labelValue);
1189+
}
1190+
});
1191+
}
1192+
1193+
private void readHost(GenerationContext context, OperationShape operation) {
1194+
TypeScriptWriter writer = context.getWriter();
1195+
if (!operation.hasTrait(EndpointTrait.class)) {
1196+
return;
11871197
}
1198+
EndpointTrait endpointTrait = operation.expectTrait(EndpointTrait.class);
1199+
if (endpointTrait.getHostPrefix().getLabels().isEmpty()) {
1200+
return;
1201+
}
1202+
// Anchor to the beginning since we're looking at the host's prefix
1203+
StringBuilder endpointRegexBuilder = new StringBuilder("^");
1204+
for (Segment segment : endpointTrait.getHostPrefix().getSegments()) {
1205+
if (segment.isLabel()) {
1206+
// Create a named capture group for the segment so we can grab it later without regard to order.
1207+
endpointRegexBuilder.append(String.format("(?<%s>.*)", segment.getContent()));
1208+
} else {
1209+
endpointRegexBuilder.append(segment.getContent().replace(".", "\\."));
1210+
}
1211+
}
1212+
writer.write("const hostRegex = new RegExp($S);", endpointRegexBuilder.toString());
1213+
writer.write("const parsedHost: RegExpMatchArray = output.endpoint.path.match(pathRegex);");
1214+
Shape input = context.getModel().expectShape(operation.getInput().get());
1215+
writer.openBlock("if (parsedHost.groups !== undefined) {", "}", () -> {
1216+
for (MemberShape member : input.members()) {
1217+
if (member.hasTrait(HostLabelTrait.class)) {
1218+
Shape target = context.getModel().expectShape(member.getTarget());
1219+
String memberName = context.getSymbolProvider().toMemberName(member);
1220+
String labelValue = getOutputValue(context, Location.LABEL,
1221+
"parsedHost.groups." + member.getMemberName(), member, target);
1222+
writer.write("contents.$L = $L;", memberName, labelValue);
1223+
}
1224+
}
1225+
});
11881226
}
11891227

11901228
private void generateOperationResponseDeserializer(

0 commit comments

Comments
 (0)