From de61ad789907597889ac908ed4e87f8bbbc78f55 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Thu, 31 Aug 2023 13:43:35 -0400 Subject: [PATCH] Refactor --- build.gradle.kts | 2 +- .../rust/codegen/core/rustlang/Writable.kt | 9 ++++- .../smithy/generators/BuilderGenerator.kt | 38 ++++--------------- .../codegen/core/rustlang/WritableTest.kt | 10 +++++ settings.gradle.kts | 2 +- 5 files changed, 28 insertions(+), 33 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index a2d6385db4..2a4758345f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,7 +18,7 @@ plugins { } allprojects { repositories { - mavenLocal() + /* mavenLocal() */ mavenCentral() google() } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt index b17eb3b030..e1b5ee64c2 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt @@ -25,6 +25,11 @@ fun Writable.isEmpty(): Boolean { return writer.toString() == RustWriter.root().toString() } +fun Writable.map(f: RustWriter.(Writable) -> Unit): Writable { + val self = this + return writable { f(self) } +} + fun Writable.isNotEmpty(): Boolean = !this.isEmpty() operator fun Writable.plus(other: Writable): Writable { @@ -108,10 +113,12 @@ fun rustTypeParameters( "#{gg:W}", "gg" to typeParameter.declaration(withAngleBrackets = false), ) + else -> { // Check if it's a writer. If it is, invoke it; Else, throw a codegen error. @Suppress("UNCHECKED_CAST") - val func = typeParameter as? Writable ?: throw CodegenException("Unhandled type '$typeParameter' encountered by rustTypeParameters writer") + val func = typeParameter as? Writable + ?: throw CodegenException("Unhandled type '$typeParameter' encountered by rustTypeParameters writer") func.invoke(this) } } diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt index cc0a1c19d2..9697cc624f 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt @@ -13,7 +13,6 @@ import software.amazon.smithy.model.shapes.StringShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.rust.codegen.core.rustlang.Attribute import software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive -import software.amazon.smithy.rust.codegen.core.rustlang.RustModule import software.amazon.smithy.rust.codegen.core.rustlang.RustType import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter import software.amazon.smithy.rust.codegen.core.rustlang.Writable @@ -23,6 +22,7 @@ import software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlockTemplat import software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape import software.amazon.smithy.rust.codegen.core.rustlang.docs import software.amazon.smithy.rust.codegen.core.rustlang.documentShape +import software.amazon.smithy.rust.codegen.core.rustlang.map import software.amazon.smithy.rust.codegen.core.rustlang.render import software.amazon.smithy.rust.codegen.core.rustlang.rust import software.amazon.smithy.rust.codegen.core.rustlang.rustBlock @@ -89,42 +89,20 @@ fun MemberShape.enforceRequired( return field } val shape = this - val ctx = arrayOf( - "checkSetString" to checkSetString, - "error" to OperationBuildError(codegenContext.runtimeConfig).missingField( - codegenContext.symbolProvider.toMemberName(shape), "A required field was not set", - ), - "field" to field, + val error = OperationBuildError(codegenContext.runtimeConfig).missingField( + codegenContext.symbolProvider.toMemberName(shape), "A required field was not set", ) val unwrapped = when (codegenContext.model.expectShape(this.target)) { is StringShape -> writable { rustTemplate( - "#{checkSetString}(#{field}).ok_or_else(||#{error})?", - *ctx, + "#{field}.filter(|f|!AsRef::::as_ref(f).trim().is_empty())", + "field" to field, ) } - else -> writable { - rustTemplate("#{field}.ok_or_else(||#{error})?", *ctx) - } - } - return unwrapped.letIf(produceOption) { writable { rust("Some(#T)", it) } } -} - -private val checkSetString = RuntimeType.forInlineFun("non_empty_str", RustModule.private("serde_util")) { - rustTemplate( - """ - pub (crate) fn non_empty_str>(field: Option) -> Option { - if let Some(field) = field { - if field.as_ref() != "" { - return Some(field) - } - } - None - } - - """, - ) + else -> field + }.map { base -> rustTemplate("#{base}.ok_or_else(||#{error})?", "base" to base, "error" to error) } + return unwrapped.letIf(produceOption) { w -> w.map { rust("Some(#T)", it) } } } class OperationBuildError(private val runtimeConfig: RuntimeConfig) { diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt index 04c5ff2f1a..a9b45582ef 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt @@ -6,6 +6,7 @@ package software.amazon.smithy.rust.codegen.core.rustlang import io.kotest.matchers.string.shouldContain +import io.kotest.matchers.string.shouldEndWith import org.junit.jupiter.api.Test import software.amazon.smithy.rust.codegen.core.smithy.RuntimeType @@ -106,4 +107,13 @@ internal class RustTypeParametersTest { }.join(writable("+"))(writer) writer.toString() shouldContain "A-B-CD+E+F" } + + @Test + fun `test map`() { + val writer = RustWriter.forModule("model") + val a = writable { rust("a") } + val b = a.map { rust("b(#T)", it) } + b(writer) + writer.toString().trim() shouldEndWith "b(a)" + } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 6c920d7217..d168d72c0d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -29,7 +29,7 @@ pluginManagement { buildscript { repositories { - mavenLocal() + /* mavenLocal() */ mavenCentral() google() }