From 49d10aecb5d768cece726b2aaab87a1136852040 Mon Sep 17 00:00:00 2001 From: John DiSanti Date: Fri, 12 May 2023 13:36:06 -0700 Subject: [PATCH] Incorporate feedback --- codegen-client-test/build.gradle.kts | 16 -- .../smithy/generators/ClientEnumGenerator.kt | 2 +- .../client/smithy/NamingObstacleCourseTest.kt | 35 ++++ .../naming-obstacle-course-prelude-ops.smithy | 92 ---------- ...ing-obstacle-course-prelude-structs.smithy | 125 ------------- .../rust/codegen/core/smithy/RuntimeType.kt | 12 +- .../core/smithy/generators/EnumGenerator.kt | 9 +- .../NamingObstacleCourseTestModels.kt | 172 ++++++++++++++++++ .../ConstrainedTraitForEnumGenerator.kt | 6 +- .../smithy/generators/ServerEnumGenerator.kt | 9 +- .../server/smithy/NamingObstacleCourseTest.kt | 32 ++++ 11 files changed, 265 insertions(+), 245 deletions(-) create mode 100644 codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt delete mode 100644 codegen-core/common-test-models/naming-obstacle-course-prelude-ops.smithy delete mode 100644 codegen-core/common-test-models/naming-obstacle-course-prelude-structs.smithy create mode 100644 codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt create mode 100644 codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/NamingObstacleCourseTest.kt diff --git a/codegen-client-test/build.gradle.kts b/codegen-client-test/build.gradle.kts index b833bfb195..f3796a6911 100644 --- a/codegen-client-test/build.gradle.kts +++ b/codegen-client-test/build.gradle.kts @@ -92,22 +92,6 @@ val allCodegenTests = "../codegen-core/common-test-models".let { commonModels -> """.trimIndent(), imports = listOf("$commonModels/naming-obstacle-course-structs.smithy"), ), - CodegenTest( - "crate#Config", - "naming_test_prelude_ops", - """ - , "codegen": { "renameErrors": false } - """.trimIndent(), - imports = listOf("$commonModels/naming-obstacle-course-prelude-ops.smithy"), - ), - CodegenTest( - "crate#Config", - "naming_test_prelude_structs", - """ - , "codegen": { "renameErrors": false } - """.trimIndent(), - imports = listOf("$commonModels/naming-obstacle-course-prelude-structs.smithy"), - ), CodegenTest("aws.protocoltests.json#TestService", "endpoint-rules"), CodegenTest("com.aws.example.rust#PokemonService", "pokemon-service-client", imports = listOf("$commonModels/pokemon.smithy", "$commonModels/pokemon-common.smithy")), CodegenTest("com.aws.example.rust#PokemonService", "pokemon-service-awsjson-client", imports = listOf("$commonModels/pokemon-awsjson.smithy", "$commonModels/pokemon-common.smithy")), diff --git a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt index 538e1df83b..64f6d9446b 100644 --- a/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt +++ b/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt @@ -66,7 +66,7 @@ data class InfallibleEnumType( impl ::std::str::FromStr for ${context.enumName} { type Err = ::std::convert::Infallible; - fn from_str(s: &str) -> #{Result} { + fn from_str(s: &str) -> #{Result}::Err> { #{Ok}(${context.enumName}::from(s)) } } diff --git a/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt new file mode 100644 index 0000000000..aba0edc1a5 --- /dev/null +++ b/codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt @@ -0,0 +1,35 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.client.smithy + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest +import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeEnumVariantsModel +import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeEnumsModel +import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeOperationsModel +import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeStructsModel + +class NamingObstacleCourseTest { + @Test + fun `test Rust prelude operation names compile`() { + clientIntegrationTest(rustPreludeOperationsModel()) { _, _ -> } + } + + @Test + fun `test Rust prelude structure names compile`() { + clientIntegrationTest(rustPreludeStructsModel()) { _, _ -> } + } + + @Test + fun `test Rust prelude enum names compile`() { + clientIntegrationTest(rustPreludeEnumsModel()) { _, _ -> } + } + + @Test + fun `test Rust prelude enum variant names compile`() { + clientIntegrationTest(rustPreludeEnumVariantsModel()) { _, _ -> } + } +} diff --git a/codegen-core/common-test-models/naming-obstacle-course-prelude-ops.smithy b/codegen-core/common-test-models/naming-obstacle-course-prelude-ops.smithy deleted file mode 100644 index 36b7ee61d3..0000000000 --- a/codegen-core/common-test-models/naming-obstacle-course-prelude-ops.smithy +++ /dev/null @@ -1,92 +0,0 @@ -$version: "1.0" -namespace crate - -use smithy.test#httpRequestTests -use smithy.test#httpResponseTests -use aws.protocols#awsJson1_1 -use aws.api#service -use smithy.framework#ValidationException - -/// Confounds model generation machinery by using operations named after every item in the Rust prelude -@awsJson1_1 -@service(sdkId: "Config") -service Config { - version: "2006-03-01", - operations: [ - // Rust Prelude - Copy, - Send, - Sized, - Sync, - Unpin, - Drop, - Fn, - FnMut, - FnOnce, - Box, - ToOwned, - Clone, - PartialEq, - PartialOrd, - Eq, - Ord, - AsRef, - AsMut, - Into, - From, - Default, - Iterator, - Extend, - IntoIterator, - DoubleEndedIterator, - ExactSizeIterator, - Option, - Some, - None, - Result, - Ok, - Err, - String, - ToString, - Vec, - ] -} - -structure Input {} -structure Output {} - -operation Copy { input: Input, output: Output } -operation Send { input: Input, output: Output } -operation Sized { input: Input, output: Output } -operation Sync { input: Input, output: Output } -operation Unpin { input: Input, output: Output } -operation Drop { input: Input, output: Output } -operation Fn { input: Input, output: Output } -operation FnMut { input: Input, output: Output } -operation FnOnce { input: Input, output: Output } -operation Box { input: Input, output: Output } -operation ToOwned { input: Input, output: Output } -operation Clone { input: Input, output: Output } -operation PartialEq { input: Input, output: Output } -operation PartialOrd { input: Input, output: Output } -operation Eq { input: Input, output: Output } -operation Ord { input: Input, output: Output } -operation AsRef { input: Input, output: Output } -operation AsMut { input: Input, output: Output } -operation Into { input: Input, output: Output } -operation From { input: Input, output: Output } -operation Default { input: Input, output: Output } -operation Iterator { input: Input, output: Output } -operation Extend { input: Input, output: Output } -operation IntoIterator { input: Input, output: Output } -operation DoubleEndedIterator { input: Input, output: Output } -operation ExactSizeIterator { input: Input, output: Output } -operation Option { input: Input, output: Output } -operation Some { input: Input, output: Output } -operation None { input: Input, output: Output } -operation Result { input: Input, output: Output } -operation Ok { input: Input, output: Output } -operation Err { input: Input, output: Output } -operation String { input: Input, output: Output } -operation ToString { input: Input, output: Output } -operation Vec { input: Input, output: Output } diff --git a/codegen-core/common-test-models/naming-obstacle-course-prelude-structs.smithy b/codegen-core/common-test-models/naming-obstacle-course-prelude-structs.smithy deleted file mode 100644 index 0047c182c3..0000000000 --- a/codegen-core/common-test-models/naming-obstacle-course-prelude-structs.smithy +++ /dev/null @@ -1,125 +0,0 @@ -$version: "1.0" -namespace crate - -use smithy.test#httpRequestTests -use smithy.test#httpResponseTests -use aws.protocols#awsJson1_1 -use aws.api#service -use smithy.framework#ValidationException - -/// Confounds model generation machinery by using structs named after every item in the Rust prelude -@awsJson1_1 -@service(sdkId: "Config") -service Config { - version: "2006-03-01", - operations: [ - UseCopy, - UseSend, - UseSized, - UseSync, - UseUnpin, - UseDrop, - UseFn, - UseFnMut, - UseFnOnce, - UseBox, - UseToOwned, - UseClone, - UsePartialEq, - UsePartialOrd, - UseEq, - UseOrd, - UseAsRef, - UseAsMut, - UseInto, - UseFrom, - UseDefault, - UseIterator, - UseExtend, - UseIntoIterator, - UseDoubleEndedIterator, - UseExactSizeIterator, - UseOption, - UseSome, - UseNone, - UseResult, - UseOk, - UseErr, - UseString, - UseToString, - UseVec, - ] -} - -// Rust Prelude -structure Copy {} -structure Send {} -structure Sized {} -structure Sync {} -structure Unpin {} -structure Drop {} -structure Fn {} -structure FnMut {} -structure FnOnce {} -structure Box {} -structure ToOwned {} -structure Clone {} -structure PartialEq {} -structure PartialOrd {} -structure Eq {} -structure Ord {} -structure AsRef {} -structure AsMut {} -structure Into {} -structure From {} -structure Default {} -structure Iterator {} -structure Extend {} -structure IntoIterator {} -structure DoubleEndedIterator {} -structure ExactSizeIterator {} -structure Option {} -structure Some {} -structure None {} -structure Result {} -structure Ok {} -structure Err {} -structure String {} -structure ToString {} -structure Vec {} - -operation UseCopy { input: Copy, output: Copy } -operation UseSend { input: Send, output: Send } -operation UseSized { input: Sized, output: Sized } -operation UseSync { input: Sync, output: Sync } -operation UseUnpin { input: Unpin, output: Unpin } -operation UseDrop { input: Drop, output: Drop } -operation UseFn { input: Fn, output: Fn } -operation UseFnMut { input: FnMut, output: FnMut } -operation UseFnOnce { input: FnOnce, output: FnOnce } -operation UseBox { input: Box, output: Box } -operation UseToOwned { input: ToOwned, output: ToOwned } -operation UseClone { input: Clone, output: Clone } -operation UsePartialEq { input: PartialEq, output: PartialEq } -operation UsePartialOrd { input: PartialOrd, output: PartialOrd } -operation UseEq { input: Eq, output: Eq } -operation UseOrd { input: Ord, output: Ord } -operation UseAsRef { input: AsRef, output: AsRef } -operation UseAsMut { input: AsMut, output: AsMut } -operation UseInto { input: Into, output: Into } -operation UseFrom { input: From, output: From } -operation UseDefault { input: Default, output: Default } -operation UseIterator { input: Iterator, output: Iterator } -operation UseExtend { input: Extend, output: Extend } -operation UseIntoIterator { input: IntoIterator, output: IntoIterator } -operation UseDoubleEndedIterator { input: DoubleEndedIterator, output: DoubleEndedIterator } -operation UseExactSizeIterator { input: ExactSizeIterator, output: ExactSizeIterator } -operation UseOption { input: Option, output: Option } -operation UseSome { input: Some, output: Some } -operation UseNone { input: None, output: None } -operation UseResult { input: Result, output: Result } -operation UseOk { input: Ok, output: Ok } -operation UseErr { input: Err, output: Err } -operation UseString { input: String, output: String } -operation UseToString { input: ToString, output: ToString } -operation UseVec { input: Vec, output: Vec } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt index 6616fdd96f..6e5b5ee8ff 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt @@ -193,9 +193,14 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) * The companion object contains commonly used RuntimeTypes */ companion object { - /** Scope that contains all Rust prelude types, but not macros or functions */ + /** + * Scope that contains all Rust prelude types, but not macros or functions. + * + * Prelude docs: https://doc.rust-lang.org/std/prelude/index.html#prelude-contents + */ val preludeScope by lazy { arrayOf( + // Rust 1.0 "Copy" to std.resolve("marker::Copy"), "Send" to Send, "Sized" to std.resolve("marker::Sized"), @@ -231,6 +236,11 @@ data class RuntimeType(val path: String, val dependency: RustDependency? = null) "String" to String, "ToString" to std.resolve("string::ToString"), "Vec" to Vec, + + // 2021 Edition + "TryFrom" to std.resolve("convert::TryFrom"), + "TryInto" to std.resolve("convert::TryInto"), + "FromIterator" to std.resolve("iter::FromIterator"), ) } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt index d5565880f1..a84820ad26 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt @@ -27,6 +27,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.MaybeRenamed import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata import software.amazon.smithy.rust.codegen.core.smithy.renamedFrom @@ -208,14 +209,15 @@ open class EnumGenerator( } }, ) - rust( + rustTemplate( """ - impl AsRef for ${context.enumName} { + impl #{AsRef} for ${context.enumName} { fn as_ref(&self) -> &str { self.as_str() } } """, + *preludeScope, ) } @@ -238,8 +240,7 @@ open class EnumGenerator( } } """, - "From" to RuntimeType.From, - "AsRef" to RuntimeType.AsRef, + *preludeScope, ) } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt new file mode 100644 index 0000000000..c45a7d0992 --- /dev/null +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt @@ -0,0 +1,172 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.core.testutil + +import software.amazon.smithy.model.Model +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope + +object NamingObstacleCourseTestModels { + private val rustPrelude = preludeScope.map { pair -> pair.first } + + /** + * Test model that confounds the generation machinery by using operations named after every item + * in the Rust prelude. + */ + fun rustPreludeOperationsModel(): Model = StringBuilder().apply { + append( + """ + ${"$"}version: "2.0" + namespace crate + + use smithy.test#httpRequestTests + use smithy.test#httpResponseTests + use aws.protocols#awsJson1_1 + use aws.api#service + use smithy.framework#ValidationException + + structure InputAndOutput {} + + @awsJson1_1 + @service(sdkId: "Config") + service Config { + version: "2006-03-01", + rename: { "smithy.api#String": "PreludeString" }, + operations: [ + """, + ) + for (item in rustPrelude) { + append("$item,\n") + } + append( + """ + ] + } + """, + ) + for (item in rustPrelude) { + append("operation $item { input: InputAndOutput, output: InputAndOutput, errors: [ValidationException] }\n") + } + }.toString().asSmithyModel() + + fun rustPreludeStructsModel(): Model = StringBuilder().apply { + append( + """ + ${"$"}version: "2.0" + namespace crate + + use smithy.test#httpRequestTests + use smithy.test#httpResponseTests + use aws.protocols#awsJson1_1 + use aws.api#service + use smithy.framework#ValidationException + + structure InputAndOutput {} + + @awsJson1_1 + @service(sdkId: "Config") + service Config { + version: "2006-03-01", + rename: { "smithy.api#String": "PreludeString" }, + operations: [ + """, + ) + for (item in rustPrelude) { + append("Use$item,\n") + } + append( + """ + ] + } + """, + ) + for (item in rustPrelude) { + append("structure $item { $item: smithy.api#String }\n") + append("operation Use$item { input: $item, output: $item, errors: [ValidationException] }\n") + } + println(toString()) + }.toString().asSmithyModel() + + fun rustPreludeEnumsModel(): Model = StringBuilder().apply { + append( + """ + ${"$"}version: "2.0" + namespace crate + + use smithy.test#httpRequestTests + use smithy.test#httpResponseTests + use aws.protocols#awsJson1_1 + use aws.api#service + use smithy.framework#ValidationException + + structure InputAndOutput {} + + @awsJson1_1 + @service(sdkId: "Config") + service Config { + version: "2006-03-01", + rename: { "smithy.api#String": "PreludeString" }, + operations: [ + """, + ) + for (item in rustPrelude) { + append("Use$item,\n") + } + append( + """ + ] + } + """, + ) + for (item in rustPrelude) { + append("enum $item { $item }\n") + append("structure Struct$item { $item: $item }\n") + append("operation Use$item { input: Struct$item, output: Struct$item, errors: [ValidationException] }\n") + } + }.toString().asSmithyModel() + + fun rustPreludeEnumVariantsModel(): Model = StringBuilder().apply { + append( + """ + ${"$"}version: "2.0" + namespace crate + + use smithy.test#httpRequestTests + use smithy.test#httpResponseTests + use aws.protocols#awsJson1_1 + use aws.api#service + use smithy.framework#ValidationException + + @awsJson1_1 + @service(sdkId: "Config") + service Config { + version: "2006-03-01", + rename: { "smithy.api#String": "PreludeString" }, + operations: [EnumOp] + } + + operation EnumOp { + input: InputAndOutput, + output: InputAndOutput, + errors: [ValidationException], + } + + structure InputAndOutput { + the_enum: TheEnum, + } + + enum TheEnum { + """, + ) + for (item in rustPrelude) { + append("$item,\n") + } + append( + """ + } + """, + ) + }.toString().asSmithyModel() +} diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedTraitForEnumGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedTraitForEnumGenerator.kt index 44992f4a48..8e52d0d4da 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedTraitForEnumGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedTraitForEnumGenerator.kt @@ -11,6 +11,7 @@ import software.amazon.smithy.model.traits.EnumTrait import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider import software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained import software.amazon.smithy.rust.codegen.core.util.expectTrait @@ -30,7 +31,7 @@ class ConstrainedTraitForEnumGenerator( val symbol = symbolProvider.toSymbol(shape) val name = symbol.name - val unconstrainedType = "String" + val unconstrainedType = RuntimeType.String.fullyQualifiedName() writer.rustTemplate( """ @@ -38,12 +39,13 @@ class ConstrainedTraitForEnumGenerator( type Unconstrained = $unconstrainedType; } - impl From<$unconstrainedType> for #{MaybeConstrained} { + impl #{From}<$unconstrainedType> for #{MaybeConstrained} { fn from(value: $unconstrainedType) -> Self { Self::Unconstrained(value) } } """, + *preludeScope, "ConstrainedTrait" to RuntimeType.ConstrainedTrait, "MaybeConstrained" to symbol.makeMaybeConstrained(), ) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerEnumGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerEnumGenerator.kt index cc811b80f2..09a0d2d5cd 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerEnumGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerEnumGenerator.kt @@ -8,9 +8,11 @@ import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.rust.codegen.core.rustlang.Writable import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock +import software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate import software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate import software.amazon.smithy.rust.codegen.core.rustlang.writable import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType +import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGeneratorContext import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumType @@ -65,7 +67,7 @@ open class ConstrainedEnum( } rustBlock("impl #T<&str> for ${context.enumName}", RuntimeType.TryFrom) { rust("type Error = #T;", constraintViolationSymbol) - rustBlock("fn try_from(s: &str) -> Result>::Error>", RuntimeType.TryFrom) { + rustBlockTemplate("fn try_from(s: &str) -> #{Result}>::Error>", *preludeScope) { rustBlock("match s") { context.sortedMembers.forEach { member -> rust("${member.value.dq()} => Ok(${context.enumName}::${member.derivedName()}),") @@ -78,13 +80,12 @@ open class ConstrainedEnum( """ impl #{TryFrom}<#{String}> for ${context.enumName} { type Error = #{ConstraintViolation}; - fn try_from(s: #{String}) -> std::result::Result>::Error> { + fn try_from(s: #{String}) -> #{Result}>::Error> { s.as_str().try_into() } } """, - "String" to RuntimeType.String, - "TryFrom" to RuntimeType.TryFrom, + *preludeScope, "ConstraintViolation" to constraintViolationSymbol, ) } diff --git a/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/NamingObstacleCourseTest.kt b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/NamingObstacleCourseTest.kt new file mode 100644 index 0000000000..b0ae1c3473 --- /dev/null +++ b/codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/NamingObstacleCourseTest.kt @@ -0,0 +1,32 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +package software.amazon.smithy.rust.codegen.server.smithy + +import org.junit.jupiter.api.Test +import software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels +import software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest + +class NamingObstacleCourseTest { + @Test + fun `test Rust prelude operation names compile`() { + serverIntegrationTest(NamingObstacleCourseTestModels.rustPreludeOperationsModel()) { _, _ -> } + } + + @Test + fun `test Rust prelude structure names compile`() { + serverIntegrationTest(NamingObstacleCourseTestModels.rustPreludeStructsModel()) { _, _ -> } + } + + @Test + fun `test Rust prelude enum names compile`() { + serverIntegrationTest(NamingObstacleCourseTestModels.rustPreludeEnumsModel()) { _, _ -> } + } + + @Test + fun `test Rust prelude enum variant names compile`() { + serverIntegrationTest(NamingObstacleCourseTestModels.rustPreludeEnumVariantsModel()) { _, _ -> } + } +}