Skip to content

Commit

Permalink
fix: add idempotencyToken generation if member is queryParam (smithy-…
Browse files Browse the repository at this point in the history
…lang#655)

* fix: add idempotencyToken generation if member is queryParam

* fix(codegen): no default idempotencyToken for required members

* fix(codegen): code style fix for idempotencyToken
  • Loading branch information
kuhe authored and milesziemer committed Dec 14, 2022
1 parent c538565 commit 41ec5fc
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 7 deletions.
1 change: 1 addition & 0 deletions smithy-typescript-codegen/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ buildscript {

dependencies {
api("software.amazon.smithy:smithy-codegen-core:$smithyVersion")
api("software.amazon.smithy:smithy-model:$smithyVersion")
api("software.amazon.smithy:smithy-rules-engine:$smithyVersion")
api("software.amazon.smithy:smithy-waiters:$smithyVersion")
implementation("software.amazon.smithy:smithy-protocol-test-traits:$smithyVersion")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
import software.amazon.smithy.model.traits.HttpErrorTrait;
import software.amazon.smithy.model.traits.HttpQueryTrait;
import software.amazon.smithy.model.traits.HttpTrait;
import software.amazon.smithy.model.traits.IdempotencyTokenTrait;
import software.amazon.smithy.model.traits.MediaTypeTrait;
import software.amazon.smithy.model.traits.StreamingTrait;
import software.amazon.smithy.model.traits.TimestampFormatTrait.Format;
Expand Down Expand Up @@ -848,22 +849,30 @@ private void writeRequestQueryParam(
"@aws-sdk/smithy-client");

Shape target = model.expectShape(binding.getMember().getTarget());

boolean isIdempotencyToken = binding.getMember().hasTrait(IdempotencyTokenTrait.class);
if (isIdempotencyToken) {
writer.addImport("v4", "generateIdempotencyToken", "uuid");
}
boolean isRequired = binding.getMember().isRequired();
String idempotencyComponent = (isIdempotencyToken && !isRequired) ? " ?? generateIdempotencyToken()" : "";
String memberAssertionComponent = (idempotencyComponent.isEmpty() ? "!" : "");

String queryValue = getInputValue(
context,
binding.getLocation(),
"input." + memberName + "!",
"input." + memberName + memberAssertionComponent,
binding.getMember(),
target
);

boolean isRequired = binding.getMember().isRequired();
writer.addImport("expectNonNull", "__expectNonNull", "@aws-sdk/smithy-client");

if (Objects.equals("input." + memberName + "!", queryValue)) {
if (Objects.equals("input." + memberName + memberAssertionComponent, queryValue)) {
String value = isRequired ? "__expectNonNull($L, `" + memberName + "`)" : "$L";
// simple undefined check
writer.write(
"$S: [," + value + "],",
"$S: [," + value + idempotencyComponent + "],",
binding.getLocationName(),
queryValue
);
Expand All @@ -875,15 +884,16 @@ private void writeRequestQueryParam(
binding.getLocationName(),
memberName,
memberName,
queryValue
queryValue // no idempotency token default for required members
);
} else {
// undefined check with lazy eval
writer.write(
"$S: [() => input.$L !== void 0, () => $L],",
"$S: [() => input.$L !== void 0, () => ($L)$L],",
binding.getLocationName(),
memberName,
queryValue
queryValue,
idempotencyComponent
);
}
}
Expand Down

0 comments on commit 41ec5fc

Please sign in to comment.