Skip to content

Commit 5c7495c

Browse files
authored
Remove internal enum values from validation message (#713)
* Remove internal enum values from validation message * Continue to generate validation for EnumTraits
1 parent 2aa666a commit 5c7495c

File tree

3 files changed

+33
-6
lines changed

3 files changed

+33
-6
lines changed

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/StructuredMemberWriter.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,12 @@
3434
import software.amazon.smithy.model.shapes.SimpleShape;
3535
import software.amazon.smithy.model.shapes.StringShape;
3636
import software.amazon.smithy.model.shapes.StructureShape;
37+
import software.amazon.smithy.model.traits.EnumDefinition;
3738
import software.amazon.smithy.model.traits.EnumTrait;
39+
import software.amazon.smithy.model.traits.EnumValueTrait;
3840
import software.amazon.smithy.model.traits.ErrorTrait;
3941
import software.amazon.smithy.model.traits.IdempotencyTokenTrait;
42+
import software.amazon.smithy.model.traits.InternalTrait;
4043
import software.amazon.smithy.model.traits.LengthTrait;
4144
import software.amazon.smithy.model.traits.MediaTypeTrait;
4245
import software.amazon.smithy.model.traits.PatternTrait;
@@ -503,6 +506,22 @@ private void writeShapeValidator(TypeScriptWriter writer,
503506
});
504507
}
505508

509+
if (shape.isEnumShape()) {
510+
writer.addImport("EnumValidator", "__EnumValidator", "@aws-smithy/server-common");
511+
Collection<MemberShape> enumValues = shape.asEnumShape().get().getAllMembers().values();
512+
writer.openBlock("new __EnumValidator([", "]),", () -> {
513+
for (MemberShape member : enumValues) {
514+
writer.write("$S,", member.expectTrait(EnumValueTrait.class).expectStringValue());
515+
}
516+
writer.write("], [");
517+
for (MemberShape member : shape.asEnumShape().get().getAllMembers().values()) {
518+
if (!member.hasTrait((InternalTrait.class)) && !member.hasTag("internal")) {
519+
writer.write("$S,", member.expectTrait(EnumValueTrait.class).expectStringValue());
520+
}
521+
}
522+
});
523+
}
524+
506525
for (Trait t : constraints) {
507526
writeSingleConstraintValidator(writer, t);
508527
}
@@ -517,12 +536,18 @@ private void writeSingleConstraintValidator(TypeScriptWriter writer, Trait trait
517536
if (trait instanceof RequiredTrait) {
518537
writer.addImport("RequiredValidator", "__RequiredValidator", "@aws-smithy/server-common");
519538
writer.write("new __RequiredValidator(),");
520-
} else if (trait instanceof EnumTrait) {
539+
} else if (trait instanceof EnumTrait && !trait.isSynthetic()) {
521540
writer.addImport("EnumValidator", "__EnumValidator", "@aws-smithy/server-common");
522541
writer.openBlock("new __EnumValidator([", "]),", () -> {
523542
for (String e : ((EnumTrait) trait).getEnumDefinitionValues()) {
524543
writer.write("$S,", e);
525544
}
545+
writer.write("], [");
546+
for (EnumDefinition enumDefinition : ((EnumTrait) trait).getValues()) {
547+
if (!enumDefinition.hasTag("internal")) {
548+
writer.write("$S, ", enumDefinition.getValue());
549+
}
550+
}
526551
});
527552
} else if (trait instanceof LengthTrait) {
528553
LengthTrait lengthTrait = (LengthTrait) trait;

smithy-typescript-ssdk-libs/server-common/src/validation/validators.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ describe("sensitive validation", () => {
3535

3636
describe("strips the failure value from the resultant validation failure", () => {
3737
it("with enums", () => {
38-
expect(sensitize(new EnumValidator(["apple", "banana", "orange"]), "pear").failureValue).toBeNull();
38+
expect(sensitize(new EnumValidator(["apple", "banana", "orange"], ["apple"]), "pear").failureValue).toBeNull();
3939
});
4040
it("with integer enums", () => {
4141
expect(sensitize(new IntegerEnumValidator([1, 2, 3]), 0).failureValue).toBeNull();
@@ -53,7 +53,7 @@ describe("sensitive validation", () => {
5353
});
5454

5555
describe("enum validation", () => {
56-
const enumValidator = new EnumValidator(["apple", "banana", "orange"]);
56+
const enumValidator = new EnumValidator(["apple", "banana", "orange"], ["apple", "banana"]);
5757

5858
it("does not fail when the enum value is found", () => {
5959
expect(enumValidator.validate("apple", "fruit")).toBeNull();
@@ -62,7 +62,7 @@ describe("enum validation", () => {
6262
it("fails when the enum value is not found", () => {
6363
expect(enumValidator.validate("kiwi", "fruit")).toEqual({
6464
constraintType: "enum",
65-
constraintValues: ["apple", "banana", "orange"],
65+
constraintValues: ["apple", "banana"],
6666
path: "fruit",
6767
failureValue: "kiwi",
6868
});

smithy-typescript-ssdk-libs/server-common/src/validation/validators.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,11 @@ export interface SingleConstraintValidator<T, F> {
153153

154154
export class EnumValidator implements SingleConstraintValidator<string, EnumValidationFailure> {
155155
private readonly allowedValues: string[];
156+
private readonly nonInternalValues: string[];
156157

157-
constructor(allowedValues: readonly string[]) {
158+
constructor(allowedValues: readonly string[], nonInternalValues: readonly string[]) {
158159
this.allowedValues = allowedValues.slice();
160+
this.nonInternalValues = nonInternalValues.slice();
159161
}
160162

161163
validate(input: string | undefined | null, path: string): EnumValidationFailure | null {
@@ -166,7 +168,7 @@ export class EnumValidator implements SingleConstraintValidator<string, EnumVali
166168
if (this.allowedValues.indexOf(input) < 0) {
167169
return {
168170
constraintType: "enum",
169-
constraintValues: this.allowedValues.slice(),
171+
constraintValues: this.nonInternalValues.slice(),
170172
path: path,
171173
failureValue: input,
172174
};

0 commit comments

Comments
 (0)