Unverified Commit 84c25865 authored by Russell Cohen's avatar Russell Cohen Committed by GitHub
Browse files

Fix support of primitive headers with a default (#402)

parent 2dc9da06
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -84,6 +84,13 @@ structure StringPayloadInput {
        code: 200,
        headers: { "x-field": "123" },
        params: { field: 123 }
    },
    {
        id: "DeserPrimitiveHeaderMissing",
        protocol: "aws.protocols#restJson1",
        code: 200,
        headers: { },
        params: { field: 0 }
    }
])
@http(uri: "/primitive", method: "POST")
+0 −11
Original line number Diff line number Diff line
@@ -38,8 +38,6 @@ import software.amazon.smithy.model.traits.EnumTrait
import software.amazon.smithy.model.traits.ErrorTrait
import software.amazon.smithy.model.traits.HttpLabelTrait
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.stripOuter
import software.amazon.smithy.rust.codegen.smithy.traits.InputBodyTrait
import software.amazon.smithy.rust.codegen.smithy.traits.OutputBodyTrait
@@ -315,15 +313,6 @@ sealed class Default {
     * This symbol should use the Rust `std::default::Default` when unset
     */
    object RustDefault : Default()

    /**
     * This symbol has a custom default implementation. This will be written into the block of `or_default(|| <block>)`
     */
    class Custom(val default: Writable) : Default() {
        fun render(writer: RustWriter) {
            default(writer)
        }
    }
}

/**
+0 −3
Original line number Diff line number Diff line
@@ -219,9 +219,6 @@ class BuilderGenerator(
                            ".ok_or(",
                            ")?"
                        ) { missingRequiredField(memberName) }
                        memberSymbol.isOptional() && default is Default.Custom -> {
                            withBlock(".or_else(||Some(", "))") { default.render(this) }
                        }
                    }
                }
            }
+14 −6
Original line number Diff line number Diff line
@@ -30,7 +30,9 @@ import software.amazon.smithy.rust.codegen.rustlang.rustBlock
import software.amazon.smithy.rust.codegen.rustlang.rustTemplate
import software.amazon.smithy.rust.codegen.rustlang.stripOuter
import software.amazon.smithy.rust.codegen.rustlang.withBlock
import software.amazon.smithy.rust.codegen.smithy.Default
import software.amazon.smithy.rust.codegen.smithy.RuntimeType
import software.amazon.smithy.rust.codegen.smithy.defaultValue
import software.amazon.smithy.rust.codegen.smithy.generators.ProtocolConfig
import software.amazon.smithy.rust.codegen.smithy.rustType
import software.amazon.smithy.rust.codegen.util.dq
@@ -285,13 +287,19 @@ class ResponseBindingGenerator(protocolConfig: ProtocolConfig, private val opera
                        "header_util" to headerUtil
                    )
                } else {
                    val fallback = when (symbolProvider.toSymbol(memberShape).defaultValue()) {
                        is Default.RustDefault -> "Ok(Default::default())"
                        is Default.NoDefault -> "Err(${format(headerUtil)}::ParseError)"
                    }
                    rustTemplate(
                        """
                        if $parsedValue.len() > 1 {
                        Err(#{header_util}::ParseError)
                    } else {
                            return Err(#{header_util}::ParseError)
                        }
                        let mut $parsedValue = $parsedValue;
                        $parsedValue.pop().ok_or(#{header_util}::ParseError)
                        match $parsedValue.pop() {
                            None => $fallback,
                            Some(item) => Ok(item),
                        }
                    """,
                        "header_util" to headerUtil