Skip to content

Commit 9311a34

Browse files
kuhesrchase
authored andcommitted
fix(endpoint): misc fixes for endpoints 2.0 based on service unit test cases (smithy-lang#600)
1 parent 72c8ad5 commit 9311a34

File tree

3 files changed

+65
-9
lines changed

3 files changed

+65
-9
lines changed

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/EndpointsV2Generator.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,14 @@ private void generateEndpointParameters() {
6969
"export interface ClientInputEndpointParameters {",
7070
"}",
7171
() -> {
72-
Map<String, String> clientContextParams =
73-
new RuleSetParameterFinder(service).getClientContextParams();
72+
RuleSetParameterFinder ruleSetParameterFinder = new RuleSetParameterFinder(service);
73+
74+
Map<String, String> clientInputParams = ruleSetParameterFinder.getClientContextParams();
75+
clientInputParams.putAll(ruleSetParameterFinder.getBuiltInParams());
7476

7577
ObjectNode ruleSet = endpointRuleSetTrait.getRuleSet().expectObjectNode();
7678
ruleSet.getObjectMember("parameters").ifPresent(parameters -> {
77-
parameters.accept(new RuleSetParametersVisitor(writer, clientContextParams));
79+
parameters.accept(new RuleSetParametersVisitor(writer, clientInputParams, true));
7880
});
7981
}
8082
);
@@ -89,6 +91,10 @@ private void generateEndpointParameters() {
8991
() -> {
9092
writer.openBlock("return {", "}", () -> {
9193
writer.write("...options,");
94+
ObjectNode ruleSet = endpointRuleSetTrait.getRuleSet().expectObjectNode();
95+
ruleSet.getObjectMember("parameters").ifPresent(parameters -> {
96+
parameters.accept(new RuleSetParametersVisitor(writer, true));
97+
});
9298
});
9399
}
94100
);

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/ParameterGenerator.java

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ public ParameterGenerator(String key, Node param) {
4040
.orElseThrow(() -> new RuntimeException("param node is not object node."));
4141

4242
Optional<BooleanNode> requiredNode = paramNode.getBooleanMember("required");
43-
4443
requiredNode.ifPresent(booleanNode -> required = booleanNode.getValue());
4544

4645
Optional<StringNode> type = paramNode.getStringMember("type");
@@ -63,6 +62,36 @@ public boolean isBuiltIn() {
6362
return param.expectObjectNode().containsMember("builtIn");
6463
}
6564

65+
public boolean hasDefault() {
66+
return param.expectObjectNode().containsMember("default");
67+
}
68+
69+
public String defaultAsCodeString() {
70+
if (!hasDefault()) {
71+
return "";
72+
}
73+
String buffer = "";
74+
buffer += parameterName;
75+
buffer += ": ";
76+
buffer += "options." + parameterName + " ?? ";
77+
ObjectNode paramNode = param.expectObjectNode();
78+
StringNode type = paramNode.expectStringMember("type");
79+
80+
switch (type.getValue()) {
81+
case "String":
82+
buffer += "\"" + paramNode.expectStringMember("default").getValue() + "\"";
83+
break;
84+
case "Boolean":
85+
buffer += paramNode.expectBooleanMember("default").getValue() ? "true" : "false";
86+
break;
87+
default:
88+
// required by linter
89+
}
90+
91+
buffer += ",";
92+
return buffer;
93+
}
94+
6695
public Map.Entry<String, String> getNameAndType() {
6796
return new AbstractMap.SimpleEntry<>(
6897
parameterName,
@@ -76,7 +105,7 @@ public Map.Entry<String, String> getNameAndType() {
76105
public String toCodeString() {
77106
String buffer = "";
78107
buffer += parameterName;
79-
if (!required) {
108+
if (!required || hasDefault()) {
80109
buffer += "?";
81110
}
82111
buffer += ": ";

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/endpointsV2/RuleSetParametersVisitor.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,52 @@
2323
import software.amazon.smithy.model.node.StringNode;
2424
import software.amazon.smithy.typescript.codegen.TypeScriptWriter;
2525

26-
26+
/**
27+
* Writes endpoint ruleset params into a client-specific config resolver step, applying defaults as needed.
28+
*/
2729
public class RuleSetParametersVisitor extends NodeVisitor.Default<Void> {
2830
private final TypeScriptWriter writer;
2931
private final Map<String, String> clientContextParams;
32+
private boolean useLocalNames = false;
33+
private boolean writeDefaults = false;
3034

3135
public RuleSetParametersVisitor(TypeScriptWriter writer) {
3236
this.writer = writer;
3337
this.clientContextParams = new HashMap<>();
3438
}
3539

36-
public RuleSetParametersVisitor(TypeScriptWriter writer, Map<String, String> clientContextParams) {
40+
public RuleSetParametersVisitor(TypeScriptWriter writer,
41+
Map<String, String> clientContextParams,
42+
boolean useLocalNames) {
3743
this.writer = writer;
3844
this.clientContextParams = clientContextParams;
45+
this.useLocalNames = useLocalNames;
46+
}
47+
48+
public RuleSetParametersVisitor(TypeScriptWriter writer, boolean writeDefaults) {
49+
this(writer);
50+
this.writeDefaults = writeDefaults;
51+
this.useLocalNames = true;
3952
}
4053

4154
@Override
4255
public Void objectNode(ObjectNode node) {
4356
Map<StringNode, Node> members = node.getMembers();
4457
for (Map.Entry<StringNode, Node> entry : members.entrySet()) {
4558
String key = entry.getKey().getValue();
59+
String localKey = key;
4660
Node param = entry.getValue();
61+
if (useLocalNames) {
62+
localKey = EndpointsParamNameMap.getLocalName(key);
63+
}
4764

48-
ParameterGenerator parameterGenerator = new ParameterGenerator(key, param);
65+
ParameterGenerator parameterGenerator = new ParameterGenerator(localKey, param);
4966

50-
if (clientContextParams.isEmpty() || clientContextParams.containsKey(key)) {
67+
if (writeDefaults) {
68+
if (parameterGenerator.hasDefault()) {
69+
writer.write(parameterGenerator.defaultAsCodeString());
70+
}
71+
} else if (clientContextParams.isEmpty() || clientContextParams.containsKey(key)) {
5172
writer.write(parameterGenerator.toCodeString());
5273
}
5374
}

0 commit comments

Comments
 (0)