Unverified Commit d9ffac3c authored by Zelda Hessler's avatar Zelda Hessler Committed by GitHub
Browse files

update: don't generate useless Into<impl T> (#1010)

* update: don't generate useless Into<impl T>

* update: changelog

* remove: unnecessary into

* update: use helper fns to generate shared code

* refactor: simplify type-to-argument converter and make it act on all RustTypes
update: fixes predating this PR
parent 4fdb6bbe
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -11,6 +11,18 @@
# meta = { "breaking" = false, "tada" = false, "bug" = false }
# author = "rcoh"

[[aws-sdk-rust]]
message = "Codegen will no longer produce builders and clients with methods that take `impl Into<T>` except for strings and boxed types."
meta = { "breaking" = true, "tada" = false, "bug" = false }
references = ["smithy-rs#990"]
author = "Velfi"

[[smithy-rs]]
message = "Codegen will no longer produce builders and clients with methods that take `impl Into<T>` except for strings and boxed types."
meta = { "breaking" = true, "tada" = false, "bug" = false }
references = ["smithy-rs#990"]
author = "Velfi"

[[aws-sdk-rust]]
message = """
The `meta`, `environment`, and `dns` Cargo feature flags were removed from `aws-config`.
+20 −0
Original line number Diff line number Diff line
@@ -128,6 +128,24 @@ fun RustType.qualifiedName(): String {
    return "$namespace$name"
}

fun RustType.implInto(fullyQualified: Boolean = true): String {
    return "impl Into<${this.render(fullyQualified)}>"
}

fun RustType.asArgument(name: String): Argument {
    return when (this) {
        is RustType.String,
        is RustType.Box -> Argument(
            "$name: ${this.implInto()}",
            "$name.into()",
        )
        else -> Argument(
            "$name: ${this.render()}",
            name,
        )
    }
}

/**
 * Render this type, including references and generic parameters.
 * - To generate something like `std::collections::HashMap<String, String>`, use this function
@@ -340,3 +358,5 @@ sealed class Attribute {
        }
    }
}

data class Argument(val argument: String, val value: String)
+13 −20
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ import software.amazon.smithy.rust.codegen.rustlang.Attribute
import software.amazon.smithy.rust.codegen.rustlang.RustReservedWords
import software.amazon.smithy.rust.codegen.rustlang.RustType
import software.amazon.smithy.rust.codegen.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.rustlang.asArgument
import software.amazon.smithy.rust.codegen.rustlang.asOptional
import software.amazon.smithy.rust.codegen.rustlang.conditionalBlock
import software.amazon.smithy.rust.codegen.rustlang.docs
@@ -120,20 +121,11 @@ class BuilderGenerator(
        member: MemberShape,
        memberName: String
    ) {
        fun builderConverter(coreType: RustType) = when (coreType) {
            is RustType.String,
            is RustType.Box -> "input.into()"
            else -> "input"
        }
        val input = coreType.asArgument("input")

        val signature = when (coreType) {
            is RustType.String,
            is RustType.Box -> "(mut self, input: impl Into<${coreType.render(true)}>) -> Self"
            else -> "(mut self, input: ${coreType.render(true)}) -> Self"
        }
        writer.documentShape(member, model)
        writer.rustBlock("pub fn $memberName$signature") {
            write("self.$memberName = Some(${builderConverter(coreType)});")
        writer.rustBlock("pub fn $memberName(mut self, ${input.argument}) -> Self") {
            write("self.$memberName = Some(${input.value});")
            write("self")
        }
    }
@@ -199,11 +191,13 @@ class BuilderGenerator(
        docs("To override the contents of this collection use [`${member.setterName()}`](Self::${member.setterName()}).")
        rust("///")
        documentShape(member, model, autoSuppressMissingDocs = false)
        rustBlock("pub fn $memberName(mut self, input: impl Into<${coreType.member.render(true)}>) -> Self") {
        val input = coreType.member.asArgument("input")

        rustBlock("pub fn $memberName(mut self, ${input.argument}) -> Self") {
            rust(
                """
                let mut v = self.$memberName.unwrap_or_default();
                v.push(input.into());
                v.push(${input.value});
                self.$memberName = Some(v);
                self
                """
@@ -217,17 +211,16 @@ class BuilderGenerator(
        docs("To override the contents of this collection use [`${member.setterName()}`](Self::${member.setterName()}).")
        rust("///")
        documentShape(member, model, autoSuppressMissingDocs = false)
        val k = coreType.key.asArgument("k")
        val v = coreType.member.asArgument("v")

        rustBlock(
            "pub fn $memberName(mut self, k: impl Into<${coreType.key.render(true)}>, v: impl Into<${
            coreType.member.render(
                true
            )
            }>) -> Self"
            "pub fn $memberName(mut self, ${k.argument}, ${v.argument}) -> Self"
        ) {
            rust(
                """
                let mut hash_map = self.$memberName.unwrap_or_default();
                hash_map.insert(k.into(), v.into());
                hash_map.insert(${k.value}, ${v.value});
                self.$memberName = Some(hash_map);
                self
                """
+9 −7
Original line number Diff line number Diff line
@@ -9,9 +9,9 @@ import software.amazon.smithy.model.Model
import software.amazon.smithy.model.shapes.MemberShape
import software.amazon.smithy.rust.codegen.rustlang.RustType
import software.amazon.smithy.rust.codegen.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.rustlang.asArgument
import software.amazon.smithy.rust.codegen.rustlang.docs
import software.amazon.smithy.rust.codegen.rustlang.documentShape
import software.amazon.smithy.rust.codegen.rustlang.render
import software.amazon.smithy.rust.codegen.rustlang.rust
import software.amazon.smithy.rust.codegen.rustlang.rustBlock

@@ -22,10 +22,12 @@ class FluentClientCore(private val model: Model) {
        docs("To override the contents of this collection use [`${member.setterName()}`](Self::${member.setterName()}).")
        rust("///")
        documentShape(member, model)
        rustBlock("pub fn $memberName(mut self, inp: impl Into<${coreType.member.render(true)}>) -> Self") {
        val input = coreType.member.asArgument("input")

        rustBlock("pub fn $memberName(mut self, ${input.argument}) -> Self") {
            rust(
                """
                self.inner = self.inner.$memberName(inp);
                self.inner = self.inner.$memberName(${input.value});
                self
                """
            )
@@ -38,13 +40,13 @@ class FluentClientCore(private val model: Model) {
        docs("To override the contents of this collection use [`${member.setterName()}`](Self::${member.setterName()}).")
        rust("///")
        documentShape(member, model)
        val k = coreType.key
        val v = coreType.member
        val k = coreType.key.asArgument("k")
        val v = coreType.member.asArgument("v")

        rustBlock("pub fn $memberName(mut self, k: impl Into<${k.render()}>, v: impl Into<${v.render()}>) -> Self") {
        rustBlock("pub fn $memberName(mut self, ${k.argument}, ${v.argument}) -> Self") {
            rust(
                """
                self.inner = self.inner.$memberName(k, v);
                self.inner = self.inner.$memberName(${k.value}, ${v.value});
                self
                """
            )
+5 −7
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ import software.amazon.smithy.rust.codegen.rustlang.RustReservedWords
import software.amazon.smithy.rust.codegen.rustlang.RustType
import software.amazon.smithy.rust.codegen.rustlang.RustWriter
import software.amazon.smithy.rust.codegen.rustlang.Writable
import software.amazon.smithy.rust.codegen.rustlang.asArgument
import software.amazon.smithy.rust.codegen.rustlang.asOptional
import software.amazon.smithy.rust.codegen.rustlang.asType
import software.amazon.smithy.rust.codegen.rustlang.docs
@@ -472,14 +473,11 @@ class FluentClientGenerator(
                            is RustType.Vec -> with(core) { renderVecHelper(member, memberName, coreType) }
                            is RustType.HashMap -> with(core) { renderMapHelper(member, memberName, coreType) }
                            else -> {
                                val signature = when (coreType) {
                                    is RustType.String,
                                    is RustType.Box -> "(mut self, inp: impl Into<${coreType.render(true)}>) -> Self"
                                    else -> "(mut self, inp: ${coreType.render(true)}) -> Self"
                                }
                                val signature = coreType.asArgument("signature")

                                documentShape(member, model)
                                rustBlock("pub fn $memberName$signature") {
                                    write("self.inner = self.inner.$memberName(inp);")
                                rustBlock("pub fn $memberName(mut self, ${signature.argument}) -> Self") {
                                    write("self.inner = self.inner.$memberName(${signature.value});")
                                    write("self")
                                }
                            }