Skip to content

fix(endpoint): misc fixes for endpoints 2.0 based on service unit test cases #600

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 29, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -69,12 +69,14 @@ private void generateEndpointParameters() {
"export interface ClientInputEndpointParameters {",
"}",
() -> {
Map<String, String> clientContextParams =
new RuleSetParameterFinder(service).getClientContextParams();
RuleSetParameterFinder ruleSetParameterFinder = new RuleSetParameterFinder(service);

Map<String, String> clientInputParams = ruleSetParameterFinder.getClientContextParams();
clientInputParams.putAll(ruleSetParameterFinder.getBuiltInParams());

ObjectNode ruleSet = endpointRuleSetTrait.getRuleSet().expectObjectNode();
ruleSet.getObjectMember("parameters").ifPresent(parameters -> {
parameters.accept(new RuleSetParametersVisitor(writer, clientContextParams));
parameters.accept(new RuleSetParametersVisitor(writer, clientInputParams, true));
});
}
);
Expand All @@ -89,6 +91,10 @@ private void generateEndpointParameters() {
() -> {
writer.openBlock("return {", "}", () -> {
writer.write("...options,");
ObjectNode ruleSet = endpointRuleSetTrait.getRuleSet().expectObjectNode();
ruleSet.getObjectMember("parameters").ifPresent(parameters -> {
parameters.accept(new RuleSetParametersVisitor(writer, true));
});
});
}
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ public ParameterGenerator(String key, Node param) {
.orElseThrow(() -> new RuntimeException("param node is not object node."));

Optional<BooleanNode> requiredNode = paramNode.getBooleanMember("required");

requiredNode.ifPresent(booleanNode -> required = booleanNode.getValue());

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

public boolean hasDefault() {
return param.expectObjectNode().containsMember("default");
}

public String defaultAsCodeString() {
if (!hasDefault()) {
return "";
}
String buffer = "";
buffer += parameterName;
buffer += ": ";
buffer += "options." + parameterName + " ?? ";
ObjectNode paramNode = param.expectObjectNode();
StringNode type = paramNode.expectStringMember("type");

switch (type.getValue()) {
case "String":
buffer += "\"" + paramNode.expectStringMember("default").getValue() + "\"";
break;
case "Boolean":
buffer += paramNode.expectBooleanMember("default").getValue() ? "true" : "false";
break;
default:
// required by linter
}

buffer += ",";
return buffer;
}

public Map.Entry<String, String> getNameAndType() {
return new AbstractMap.SimpleEntry<>(
parameterName,
Expand All @@ -76,7 +105,7 @@ public Map.Entry<String, String> getNameAndType() {
public String toCodeString() {
String buffer = "";
buffer += parameterName;
if (!required) {
if (!required || hasDefault()) {
buffer += "?";
}
buffer += ": ";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,31 +23,52 @@
import software.amazon.smithy.model.node.StringNode;
import software.amazon.smithy.typescript.codegen.TypeScriptWriter;


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

public RuleSetParametersVisitor(TypeScriptWriter writer) {
this.writer = writer;
this.clientContextParams = new HashMap<>();
}

public RuleSetParametersVisitor(TypeScriptWriter writer, Map<String, String> clientContextParams) {
public RuleSetParametersVisitor(TypeScriptWriter writer,
Map<String, String> clientContextParams,
boolean useLocalNames) {
this.writer = writer;
this.clientContextParams = clientContextParams;
this.useLocalNames = useLocalNames;
}

public RuleSetParametersVisitor(TypeScriptWriter writer, boolean writeDefaults) {
this(writer);
this.writeDefaults = writeDefaults;
this.useLocalNames = true;
}

@Override
public Void objectNode(ObjectNode node) {
Map<StringNode, Node> members = node.getMembers();
for (Map.Entry<StringNode, Node> entry : members.entrySet()) {
String key = entry.getKey().getValue();
String localKey = key;
Node param = entry.getValue();
if (useLocalNames) {
localKey = EndpointsParamNameMap.getLocalName(key);
}

ParameterGenerator parameterGenerator = new ParameterGenerator(key, param);
ParameterGenerator parameterGenerator = new ParameterGenerator(localKey, param);

if (clientContextParams.isEmpty() || clientContextParams.containsKey(key)) {
if (writeDefaults) {
if (parameterGenerator.hasDefault()) {
writer.write(parameterGenerator.defaultAsCodeString());
}
} else if (clientContextParams.isEmpty() || clientContextParams.containsKey(key)) {
writer.write(parameterGenerator.toCodeString());
}
}
Expand Down