27
27
import software .amazon .smithy .model .shapes .IntEnumShape ;
28
28
import software .amazon .smithy .model .shapes .MemberShape ;
29
29
import software .amazon .smithy .model .shapes .Shape ;
30
+ import software .amazon .smithy .model .traits .EnumDefaultTrait ;
30
31
import software .amazon .smithy .model .traits .EnumValueTrait ;
31
32
import software .amazon .smithy .model .validation .AbstractValidator ;
32
33
import software .amazon .smithy .model .validation .ValidationEvent ;
@@ -52,15 +53,25 @@ public List<ValidationEvent> validate(Model model) {
52
53
private void validateEnumShape (List <ValidationEvent > events , EnumShape shape ) {
53
54
Set <String > values = new HashSet <>();
54
55
for (MemberShape member : shape .members ()) {
56
+ if (member .hasTrait (EnumDefaultTrait .ID )) {
57
+ continue ;
58
+ }
55
59
Optional <String > value = member .expectTrait (EnumValueTrait .class ).getStringValue ();
56
60
if (!value .isPresent ()) {
57
61
events .add (error (member , member .expectTrait (EnumValueTrait .class ),
58
62
"The enumValue trait must use the string option when applied to enum shapes." ));
59
- } else if (!values .add (value .get ())) {
60
- events .add (error (member , String .format (
61
- "Multiple enum members found with duplicate value `%s`" ,
62
- value .get ()
63
- )));
63
+ } else {
64
+ if (!values .add (value .get ())) {
65
+ events .add (error (member , String .format (
66
+ "Multiple enum members found with duplicate value `%s`" ,
67
+ value .get ()
68
+ )));
69
+ }
70
+ if (value .get ().equals ("" )) {
71
+ events .add (error (member , "enum values may not be empty because an empty string is the "
72
+ + "default value of enum shapes. Instead, use `smithy.api#enumDefault` to set an "
73
+ + "explicit name for the default value." ));
74
+ }
64
75
}
65
76
validateEnumMemberName (events , member );
66
77
}
@@ -69,6 +80,9 @@ private void validateEnumShape(List<ValidationEvent> events, EnumShape shape) {
69
80
private void validateIntEnumShape (List <ValidationEvent > events , IntEnumShape shape ) {
70
81
Set <Integer > values = new HashSet <>();
71
82
for (MemberShape member : shape .members ()) {
83
+ if (member .hasTrait (EnumDefaultTrait .ID )) {
84
+ continue ;
85
+ }
72
86
if (!member .hasTrait (EnumValueTrait .ID )) {
73
87
events .add (missingIntEnumValue (member , member ));
74
88
} else if (!member .expectTrait (EnumValueTrait .class ).getIntValue ().isPresent ()) {
@@ -81,6 +95,11 @@ private void validateIntEnumShape(List<ValidationEvent> events, IntEnumShape sha
81
95
value
82
96
)));
83
97
}
98
+ if (value == 0 ) {
99
+ events .add (error (member , "intEnum values may not be set to 0 because 0 is the "
100
+ + "default value of intEnum shapes. Instead, use `smithy.api#enumDefault` to set an "
101
+ + "explicit name for the default value." ));
102
+ }
84
103
}
85
104
validateEnumMemberName (events , member );
86
105
}
0 commit comments