Skip to content

Commit 9e684eb

Browse files
committed
Detect if the uniqueItems trait is used
And act like in the rest of the unsupported constraint traits cases. I missed this in the implementation of #1342.
1 parent 06c23f6 commit 9e684eb

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

Diff for: codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt

+16-1
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,10 @@ private sealed class UnsupportedConstraintMessageKind {
9494
level,
9595
buildMessageShapeHasUnsupportedConstraintTrait(shape, rangeTrait, constraintTraitsUberIssue),
9696
)
97+
is UnsupportedUniqueItemsTraitOnShape -> LogMessage(
98+
level,
99+
buildMessageShapeHasUnsupportedConstraintTrait(shape, uniqueItemsTrait, constraintTraitsUberIssue),
100+
)
97101
}
98102
}
99103
}
@@ -104,6 +108,7 @@ private data class UnsupportedLengthTraitOnStreamingBlobShape(val shape: BlobSha
104108
private data class UnsupportedLengthTraitOnCollectionOrOnBlobShape(val shape: Shape, val lengthTrait: LengthTrait) : UnsupportedConstraintMessageKind()
105109
private data class UnsupportedPatternTraitOnStringShape(val shape: Shape, val patternTrait: PatternTrait) : UnsupportedConstraintMessageKind()
106110
private data class UnsupportedRangeTraitOnShape(val shape: Shape, val rangeTrait: RangeTrait) : UnsupportedConstraintMessageKind()
111+
private data class UnsupportedUniqueItemsTraitOnShape(val shape: Shape, val uniqueItemsTrait: UniqueItemsTrait) : UnsupportedConstraintMessageKind()
107112

108113
data class LogMessage(val level: Level, val message: String)
109114
data class ValidationResult(val shouldAbort: Boolean, val messages: List<LogMessage>)
@@ -228,13 +233,23 @@ fun validateUnsupportedConstraints(model: Model, service: ServiceShape, codegenC
228233
.map { (shape, rangeTrait) -> UnsupportedRangeTraitOnShape(shape, rangeTrait as RangeTrait) }
229234
.toSet()
230235

236+
// 7. UniqueItems trait on any shape is used. It has not been implemented yet.
237+
// TODO(https://github.com/awslabs/smithy-rs/issues/1401)
238+
val unsupportedUniqueItemsTraitOnShapeSet = walker
239+
.walkShapes(service)
240+
.asSequence()
241+
.filterMapShapesToTraits(setOf(UniqueItemsTrait::class.java))
242+
.map { (shape, uniqueItemsTrait) -> UnsupportedUniqueItemsTraitOnShape(shape, uniqueItemsTrait as UniqueItemsTrait) }
243+
.toSet()
244+
231245
val messages =
232246
unsupportedConstraintOnMemberShapeSet.map { it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints) } +
233247
unsupportedLengthTraitOnStreamingBlobShapeSet.map { it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints) } +
234248
unsupportedConstraintOnShapeReachableViaAnEventStreamSet.map { it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints) } +
235249
unsupportedLengthTraitOnCollectionOrOnBlobShapeSet.map { it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints) } +
236250
unsupportedPatternTraitOnStringShapeSet.map { it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints) } +
237-
unsupportedRangeTraitOnShapeSet.map { it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints) }
251+
unsupportedRangeTraitOnShapeSet.map { it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints) } +
252+
unsupportedUniqueItemsTraitOnShapeSet.map { it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints) }
238253

239254
return ValidationResult(shouldAbort = messages.any { it.level == Level.SEVERE }, messages)
240255
}

Diff for: codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraintsAreNotUsedTest.kt

+21
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,27 @@ internal class ValidateUnsupportedConstraintsAreNotUsedTest {
214214
validationResult.messages[0].message shouldContain "The integer shape `test#RangeInteger` has the constraint trait `smithy.api#range` attached"
215215
}
216216

217+
@Test
218+
fun `it should detect when the unique items trait is used`() {
219+
val model =
220+
"""
221+
$baseModel
222+
223+
structure TestInputOutput {
224+
uniqueItemsList: UniqueItemsList
225+
}
226+
227+
@uniqueItems
228+
list UniqueItemsList {
229+
member: String
230+
}
231+
""".asSmithyModel()
232+
val validationResult = validateModel(model)
233+
234+
validationResult.messages shouldHaveSize 1
235+
validationResult.messages[0].message shouldContain "The list shape `test#UniqueItemsList` has the constraint trait `smithy.api#uniqueItems` attached"
236+
}
237+
217238
@Test
218239
fun `it should abort when ignoreUnsupportedConstraints is false and unsupported constraints are used`() {
219240
val validationResult = validateModel(constraintTraitOnStreamingBlobShapeModel, ServerCodegenConfig())

0 commit comments

Comments
 (0)