Unverified Commit 3d007674 authored by Fahad Zubair's avatar Fahad Zubair Committed by GitHub
Browse files

Constraint member types are refactored as standalone shapes. (#2256)



* Constraint member types are refactored as standalone shapes.

* ModelModule to ServerRustModule.model

* Constraints are written to the correct module

* Code generates for non-public constrained types.

* Removed a comment

* Using ConcurrentHashmap just to be on the safe side

* Clippy warnings removed on constraints, k.into() if gated

* Wordings for some of the checks changed

* Test need to call rustCrate.renderInlineMemoryModules

* ktlintFormat related changes

* RustCrate need to be passed for server builder

* Param renamed in getParentAndInlineModuleForConstrainedMember

* pubCrate to publicConstrainedType rename

* PythonServer symbol builder needed to pass publicConstrainedTypes

* @required still remains on the member shape after transformation

* ConcurrentLinkedQueue used for root RustWriters

* runTestCase does not run the tests but just sets them up, hence has been renamed

* CHANGELOG added

---------

Co-authored-by: default avatarFahad Zubair <fahadzub@amazon.com>
parent 5a5a7c44
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -229,3 +229,9 @@ produced Rust code that did not compile"""
references = ["smithy-rs#2352", "smithy-rs#2343"]
meta = { "breaking" = false, "tada" = false, "bug" = true, "target" = "server"}
author = "82marbag"

[[smithy-rs]]
message = "Support for constraint traits on member shapes (constraint trait precedence) has been added."
references = ["smithy-rs#1969"]
meta = { "breaking" = false, "tada" = true, "bug" = false, "target" = "server" }
author = "drganjoo"
+3 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider
import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.core.rustlang.implBlock
import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget
import software.amazon.smithy.rust.codegen.core.smithy.RustCrate
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider
import software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestModels
@@ -51,6 +52,7 @@ abstract class ClientEventStreamBaseRequirements : EventStreamTestRequirements<C
    )

    override fun renderBuilderForShape(
        rustCrate: RustCrate,
        writer: RustWriter,
        codegenContext: ClientCodegenContext,
        shape: StructureShape,
@@ -73,6 +75,7 @@ abstract class ClientEventStreamBaseRequirements : EventStreamTestRequirements<C
    }

    override fun renderError(
        rustCrate: RustCrate,
        writer: RustWriter,
        codegenContext: ClientCodegenContext,
        shape: StructureShape,
+3 −2
Original line number Diff line number Diff line
@@ -17,12 +17,13 @@ import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestTools
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestVariety
import software.amazon.smithy.rust.codegen.core.testutil.TestEventStreamProject
import software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig
import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest

class ClientEventStreamMarshallerGeneratorTest {
    @ParameterizedTest
    @ArgumentsSource(TestCasesProvider::class)
    fun test(testCase: EventStreamTestModels.TestCase) {
        EventStreamTestTools.runTestCase(
        EventStreamTestTools.setupTestCase(
            testCase,
            object : ClientEventStreamBaseRequirements() {
                override fun renderGenerator(
@@ -41,6 +42,6 @@ class ClientEventStreamMarshallerGeneratorTest {
            },
            CodegenTarget.CLIENT,
            EventStreamTestVariety.Marshall,
        )
        ).compileAndTest()
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -19,12 +19,13 @@ import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestModels
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestTools
import software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestVariety
import software.amazon.smithy.rust.codegen.core.testutil.TestEventStreamProject
import software.amazon.smithy.rust.codegen.core.testutil.compileAndTest

class ClientEventStreamUnmarshallerGeneratorTest {
    @ParameterizedTest
    @ArgumentsSource(TestCasesProvider::class)
    fun test(testCase: EventStreamTestModels.TestCase) {
        EventStreamTestTools.runTestCase(
        EventStreamTestTools.setupTestCase(
            testCase,
            object : ClientEventStreamBaseRequirements() {
                override fun renderGenerator(
@@ -44,6 +45,6 @@ class ClientEventStreamUnmarshallerGeneratorTest {
            },
            CodegenTarget.CLIENT,
            EventStreamTestVariety.Unmarshall,
        )
        ).compileAndTest()
    }
}
+13 −6
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.CodegenContext
import software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget
import software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker
import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType
import software.amazon.smithy.rust.codegen.core.smithy.RustCrate
import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider
import software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator
import software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant
@@ -62,6 +63,7 @@ interface EventStreamTestRequirements<C : CodegenContext> {

    /** Render a builder for the given shape */
    fun renderBuilderForShape(
        rustCrate: RustCrate,
        writer: RustWriter,
        codegenContext: C,
        shape: StructureShape,
@@ -76,17 +78,21 @@ interface EventStreamTestRequirements<C : CodegenContext> {
    )

    /** Render an error struct and builder */
    fun renderError(writer: RustWriter, codegenContext: C, shape: StructureShape)
    fun renderError(rustCrate: RustCrate, writer: RustWriter, codegenContext: C, shape: StructureShape)
}

object EventStreamTestTools {
    fun <C : CodegenContext> runTestCase(
    fun <C : CodegenContext> setupTestCase(
        testCase: EventStreamTestModels.TestCase,
        requirements: EventStreamTestRequirements<C>,
        codegenTarget: CodegenTarget,
        variety: EventStreamTestVariety,
    ) {
        val model = EventStreamNormalizer.transform(OperationNormalizer.transform(testCase.model))
        transformers: List<(Model) -> Model> = listOf(),
    ): TestWriterDelegator {
        val model = (listOf(OperationNormalizer::transform, EventStreamNormalizer::transform) + transformers).fold(testCase.model) { model, transformer ->
            transformer(model)
        }

        val serviceShape = model.expectShape(ShapeId.from("test#TestService")) as ServiceShape
        val codegenContext = requirements.createCodegenContext(
            model,
@@ -104,7 +110,8 @@ object EventStreamTestTools {
                EventStreamTestVariety.Unmarshall -> writeUnmarshallTestCases(testCase, codegenTarget, generator)
            }
        }
        test.project.compileAndTest()

        return test.project
    }

    private fun <C : CodegenContext> generateTestProject(
@@ -128,7 +135,7 @@ object EventStreamTestTools {
            requirements.renderOperationError(this, model, symbolProvider, operationShape)
            requirements.renderOperationError(this, model, symbolProvider, unionShape)
            for (shape in errors) {
                requirements.renderError(this, codegenContext, shape)
                requirements.renderError(project, this, codegenContext, shape)
            }
        }
        val inputOutput = model.lookup<StructureShape>("test#TestStreamInputOutput")
Loading