Loading codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/Instantiator.kt +7 −3 Original line number Diff line number Diff line Loading @@ -54,10 +54,14 @@ class Instantiator( RuntimeType.Instant(runtimeConfig) ) /** * ```rust * Blob::new(\"arg\") * ``` */ is BlobShape -> writer.write( "\$T::new(\$T(${(arg as StringNode).value.dq()}).unwrap())", RuntimeType.Blob(runtimeConfig), RuntimeType.Base64Decode(runtimeConfig) "\$T::new(${(arg as StringNode).value.dq()})", RuntimeType.Blob(runtimeConfig) ) // Simple Shapes Loading codegen/src/test/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/InstantiatorTest.kt +20 −1 Original line number Diff line number Diff line Loading @@ -2,11 +2,15 @@ package software.amazon.smithy.rust.codegen.smithy.generators import org.junit.jupiter.api.Test import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.node.StringNode import software.amazon.smithy.model.shapes.BlobShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.rust.codegen.lang.RustWriter import software.amazon.smithy.rust.codegen.lang.rustBlock import software.amazon.smithy.rust.codegen.lang.withBlock import software.amazon.smithy.rust.codegen.util.dq import software.amazon.smithy.rust.codegen.util.lookup import software.amazon.smithy.rust.testutil.TestRuntimeConfig import software.amazon.smithy.rust.testutil.asSmithy Loading Loading @@ -44,7 +48,6 @@ class InstantiatorTest { map: NestedMap } map NestedMap { key: String, value: Inner Loading Loading @@ -174,4 +177,20 @@ class InstantiatorTest { } writer.shouldCompile(strict = true) } @Test fun `blob inputs are binary data`() { // "Parameter values that contain binary data MUST be defined using values // that can be represented in plain text (for example, use "foo" and not "Zm9vCg==")." val writer = RustWriter.forModule("lib") val sut = Instantiator(symbolProvider, model, runtimeConfig) writer.write("#[test]") writer.rustBlock("fn test_blob()") { withBlock("let blob = ", ";") { sut.render(StringNode.parse("foo".dq()), BlobShape.builder().id(ShapeId.from("com.example#Blob")).build(), this) } write("assert_eq!(std::str::from_utf8(blob.as_ref()).unwrap(), \"foo\");") } writer.shouldCompile() } } rust-runtime/smithy-types/src/lib.rs +8 −2 Original line number Diff line number Diff line Loading @@ -86,8 +86,14 @@ pub struct Blob { } impl Blob { pub fn new(inp: Vec<u8>) -> Self { Blob { inner: inp } pub fn new<T: Into<Vec<u8>>>(inp: T) -> Self { Blob { inner: inp.into() } } } impl AsRef<[u8]> for Blob { fn as_ref(&self) -> &[u8] { &self.inner } } Loading Loading
codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/Instantiator.kt +7 −3 Original line number Diff line number Diff line Loading @@ -54,10 +54,14 @@ class Instantiator( RuntimeType.Instant(runtimeConfig) ) /** * ```rust * Blob::new(\"arg\") * ``` */ is BlobShape -> writer.write( "\$T::new(\$T(${(arg as StringNode).value.dq()}).unwrap())", RuntimeType.Blob(runtimeConfig), RuntimeType.Base64Decode(runtimeConfig) "\$T::new(${(arg as StringNode).value.dq()})", RuntimeType.Blob(runtimeConfig) ) // Simple Shapes Loading
codegen/src/test/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/InstantiatorTest.kt +20 −1 Original line number Diff line number Diff line Loading @@ -2,11 +2,15 @@ package software.amazon.smithy.rust.codegen.smithy.generators import org.junit.jupiter.api.Test import software.amazon.smithy.model.node.Node import software.amazon.smithy.model.node.StringNode import software.amazon.smithy.model.shapes.BlobShape import software.amazon.smithy.model.shapes.ShapeId import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.rust.codegen.lang.RustWriter import software.amazon.smithy.rust.codegen.lang.rustBlock import software.amazon.smithy.rust.codegen.lang.withBlock import software.amazon.smithy.rust.codegen.util.dq import software.amazon.smithy.rust.codegen.util.lookup import software.amazon.smithy.rust.testutil.TestRuntimeConfig import software.amazon.smithy.rust.testutil.asSmithy Loading Loading @@ -44,7 +48,6 @@ class InstantiatorTest { map: NestedMap } map NestedMap { key: String, value: Inner Loading Loading @@ -174,4 +177,20 @@ class InstantiatorTest { } writer.shouldCompile(strict = true) } @Test fun `blob inputs are binary data`() { // "Parameter values that contain binary data MUST be defined using values // that can be represented in plain text (for example, use "foo" and not "Zm9vCg==")." val writer = RustWriter.forModule("lib") val sut = Instantiator(symbolProvider, model, runtimeConfig) writer.write("#[test]") writer.rustBlock("fn test_blob()") { withBlock("let blob = ", ";") { sut.render(StringNode.parse("foo".dq()), BlobShape.builder().id(ShapeId.from("com.example#Blob")).build(), this) } write("assert_eq!(std::str::from_utf8(blob.as_ref()).unwrap(), \"foo\");") } writer.shouldCompile() } }
rust-runtime/smithy-types/src/lib.rs +8 −2 Original line number Diff line number Diff line Loading @@ -86,8 +86,14 @@ pub struct Blob { } impl Blob { pub fn new(inp: Vec<u8>) -> Self { Blob { inner: inp } pub fn new<T: Into<Vec<u8>>>(inp: T) -> Self { Blob { inner: inp.into() } } } impl AsRef<[u8]> for Blob { fn as_ref(&self) -> &[u8] { &self.inner } } Loading