Skip to content

Commit 6b90fce

Browse files
committed
fix(codegen): merge partition & service variants using tags as unique key
1 parent bcfb45b commit 6b90fce

File tree

1 file changed

+35
-17
lines changed
  • codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen

1 file changed

+35
-17
lines changed

codegen/smithy-aws-typescript-codegen/src/main/java/software/amazon/smithy/aws/typescript/codegen/EndpointGenerator.java

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ private void writePartitionHash() {
138138
}
139139
});
140140
writer.write("regionRegex: $S,", partition.regionRegex);
141-
writer.write("variants: $L,", ArrayNode.prettyPrintJson(partition.getVariants()));
141+
writer.write("variants: $L,", ArrayNode.prettyPrintJson(partition.variants));
142142
partition.getPartitionEndpoint().ifPresent(
143143
endpoint -> writer.write("endpoint: $S,", endpoint));
144144
});
@@ -199,7 +199,7 @@ private String getResolvedHostname(String hostnameTemplate, String dnsSuffix, St
199199
}
200200

201201
private final class Partition {
202-
final ObjectNode defaults;
202+
final ArrayNode variants;
203203
final String dnsSuffix;
204204
final String identifier;
205205
final String regionRegex;
@@ -210,7 +210,8 @@ private Partition(ObjectNode config, String partition) {
210210
this.config = config;
211211
// Resolve the partition defaults + the service defaults.
212212
ObjectNode partitionDefaults = config.expectObjectMember("defaults");
213-
defaults = partitionDefaults.merge(getService().getObjectMember("defaults").orElse(Node.objectNode()));
213+
ObjectNode serviceDefaults = getService().getObjectMember("defaults").orElse(Node.objectNode());
214+
ObjectNode defaults = partitionDefaults.merge(serviceDefaults);
214215

215216
dnsSuffix = config.expectStringMember("dnsSuffix").getValue();
216217
identifier = partition;
@@ -219,10 +220,12 @@ private Partition(ObjectNode config, String partition) {
219220
// Resolve the template to use for this service in this partition.
220221
String hostname = defaults.expectStringMember("hostname").getValue();
221222
hostnameTemplate = getResolvedHostname(hostname, dnsSuffix, endpointPrefix);
222-
}
223223

224-
ObjectNode getDefaults() {
225-
return defaults;
224+
ArrayNode mergedVariants = getMergedVariants(
225+
partitionDefaults.getArrayMember("variants").orElse(Node.arrayNode()),
226+
serviceDefaults.getArrayMember("variants").orElse(Node.arrayNode())
227+
);
228+
variants = getVariants(mergedVariants);
226229
}
227230

228231
ObjectNode getService() {
@@ -243,24 +246,39 @@ Set<String> getAllRegions() {
243246
return regions;
244247
}
245248

246-
ArrayNode getVariants() {
249+
private ArrayNode getVariants(ArrayNode mergedVariants) {
247250
List<Node> allVariants = new ArrayList<Node>();
248251

249252
allVariants.add(getDefaultVariant(hostnameTemplate));
250-
if (defaults.containsMember("variants")) {
251-
ArrayNode variants = defaults.expectArrayMember("variants");
252-
variants.forEach(variant -> {
253-
ObjectNode variantNode = variant.expectObjectNode();
254-
String hostname = variantNode.expectStringMember("hostname").getValue();
255-
String dnsSuffix = variantNode.getStringMemberOrDefault("dnsSuffix", this.dnsSuffix);
256-
String resolvedHostname = getResolvedHostname(hostname, dnsSuffix, endpointPrefix);
257-
allVariants.add(variantNode.withMember("hostname", resolvedHostname).withoutMember("dnsSuffix"));
258-
});
259-
}
253+
mergedVariants.forEach(mergedVariant -> {
254+
ObjectNode variantNode = mergedVariant.expectObjectNode();
255+
String hostname = variantNode.expectStringMember("hostname").getValue();
256+
String dnsSuffix = variantNode.getStringMemberOrDefault("dnsSuffix", this.dnsSuffix);
257+
String resolvedHostname = getResolvedHostname(hostname, dnsSuffix, endpointPrefix);
258+
allVariants.add(variantNode.withMember("hostname", resolvedHostname).withoutMember("dnsSuffix"));
259+
});
260260

261261
return ArrayNode.fromNodes(allVariants);
262262
}
263263

264+
private ArrayNode getMergedVariants(ArrayNode partitionVariants, ArrayNode serviceVariants) {
265+
List<Node> mergedVariants = new ArrayList<Node>();
266+
267+
partitionVariants.forEach(partitionVariant -> {
268+
ObjectNode partitionVariantNode = partitionVariant.expectObjectNode();
269+
ArrayNode tags = partitionVariantNode.expectArrayMember("tags");
270+
Node equivalentServiceVariantNode = serviceVariants.getElements().stream()
271+
.filter(serviceVariantNode -> tags.equals(
272+
serviceVariantNode.expectObjectNode().expectArrayMember("tags")))
273+
.findFirst()
274+
.orElse(null);
275+
mergedVariants.add((equivalentServiceVariantNode == null)
276+
? partitionVariantNode : equivalentServiceVariantNode);
277+
});
278+
279+
return ArrayNode.fromNodes(mergedVariants);
280+
}
281+
264282
Optional<String> getPartitionEndpoint() {
265283
ObjectNode service = getService();
266284
// Note: regionalized services always use regionalized endpoints.

0 commit comments

Comments
 (0)