Skip to content

Commit deb7360

Browse files
squash commit
1 parent 63e59f8 commit deb7360

File tree

16 files changed

+181
-94
lines changed

16 files changed

+181
-94
lines changed

buildSrc/src/main/kotlin/CodegenTestCommon.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,25 +245,29 @@ fun Project.registerCargoCommandsTasks(
245245
this.tasks.register<Exec>(Cargo.CHECK.toString) {
246246
dependsOn(dependentTasks)
247247
workingDir(outputDir)
248+
environment("RUSTFLAGS", "--cfg aws_sdk_unstable")
248249
commandLine("cargo", "check", "--lib", "--tests", "--benches", "--all-features")
249250
}
250251

251252
this.tasks.register<Exec>(Cargo.TEST.toString) {
252253
dependsOn(dependentTasks)
253254
workingDir(outputDir)
255+
environment("RUSTFLAGS", "--cfg aws_sdk_unstable")
254256
commandLine("cargo", "test", "--all-features")
255257
}
256258

257259
this.tasks.register<Exec>(Cargo.DOCS.toString) {
258260
dependsOn(dependentTasks)
259261
workingDir(outputDir)
260262
environment("RUSTDOCFLAGS", defaultRustDocFlags)
261-
commandLine("cargo", "doc", "--no-deps", "--document-private-items")
263+
environment("RUSTFLAGS", "--cfg aws_sdk_unstable")
264+
commandLine("cargo", "doc", "--no-deps", "--document-private-items", "--all-features")
262265
}
263266

264267
this.tasks.register<Exec>(Cargo.CLIPPY.toString) {
265268
dependsOn(dependentTasks)
266269
workingDir(outputDir)
267-
commandLine("cargo", "clippy")
270+
environment("RUSTFLAGS", "--cfg aws_sdk_unstable")
271+
commandLine("cargo", "clippy", "--all-features")
268272
}
269273
}

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator
2121
import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGeneratorContext
2222
import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumMemberModel
2323
import software.amazon.smithy.rust.codegen.core.smithy.generators.EnumType
24+
import software.amazon.smithy.rust.codegen.core.smithy.generators.RenderSerdeAttribute
2425
import software.amazon.smithy.rust.codegen.core.util.dq
2526

2627
/** Infallible enums have an `Unknown` variant and can't fail to parse */
@@ -97,6 +98,8 @@ data class InfallibleEnumType(
9798
part of the enums that are public interface.
9899
""".trimIndent(),
99100
)
101+
102+
RenderSerdeAttribute.writeAttributes(this)
100103
context.enumMeta.render(this)
101104
rust("struct $UnknownVariantValue(pub(crate) String);")
102105
rustBlock("impl $UnknownVariantValue") {

codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,8 @@ class FluentClientGenerator(
268268
) {
269269
val outputType = symbolProvider.toSymbol(operation.outputShape(model))
270270
val errorType = symbolProvider.symbolForOperationError(operation)
271+
val inputBuilderType = symbolProvider.symbolForBuilder(input)
272+
val fnName = clientOperationFnName(operation, symbolProvider)
271273

272274
// Have to use fully-qualified result here or else it could conflict with an op named Result
273275
rustTemplate(
@@ -308,24 +310,12 @@ class FluentClientGenerator(
308310
self.handle.client.call(op).await
309311
}
310312
311-
##[#{Unstable}]
312-
/// This function replaces the parameter with new one.
313-
/// It is useful when you want to replace the existing data with de-serialized data.
314-
/// ```rust
315-
/// let deserialized_parameters: #{InputBuilderType} = serde_json::from_str(parameters_written_in_json).unwrap();
316-
/// let outcome: #{OperationOutput} = client.#{operationFnName}().set_fields(&deserialized_parameters).send().await;
317-
/// ```
318-
pub fn set_fields(mut self, data: #{InputBuilderType}) -> Self {
319-
self.inner = data;
320-
self
321-
}
322313
""",
323314
"CustomizableOperation" to codegenContext.featureGatedCustomizeModule().toType()
324315
.resolve("CustomizableOperation"),
325316
"ClassifyRetry" to RuntimeType.classifyRetry(runtimeConfig),
326317
"OperationError" to errorType,
327318
"OperationOutput" to outputType,
328-
"operationFnName" to clientOperationFnName(operation, symbolProvider),
329319
"SdkError" to RuntimeType.sdkError(runtimeConfig),
330320
"SdkSuccess" to RuntimeType.sdkSuccess(runtimeConfig),
331321
"send_bounds" to generics.sendBounds(operationSymbol, outputType, errorType, retryClassifier),
@@ -335,6 +325,43 @@ class FluentClientGenerator(
335325
generics.toRustGenerics(),
336326
),
337327
)
328+
329+
// this fixes this error
330+
// error[E0592]: duplicate definitions with name `set_fields`
331+
// --> sdk/connectcases/src/operation/update_case/builders.rs:115:5
332+
// |
333+
// 78 | / pub fn set_fields(
334+
// 79 | | mut self,
335+
// 80 | | data: crate::operation::update_case::builders::UpdateCaseInputBuilder,
336+
// 81 | | ) -> Self {
337+
// | |_____________- other definition for `set_fields`
338+
// ...
339+
// 115 | / pub fn set_fields(
340+
// 116 | | mut self,
341+
// 117 | | input: std::option::Option<std::vec::Vec<crate::types::FieldValue>>,
342+
// 118 | | ) -> Self {
343+
// | |_____________^ duplicate definitions for `set_fields`
344+
if (inputBuilderType.toString().endsWith("Builder")) {
345+
rustTemplate(
346+
"""
347+
##[#{AwsSdkUnstableAttribute}]
348+
/// This function replaces the parameter with new one.
349+
/// It is useful when you want to replace the existing data with de-serialized data.
350+
/// ```compile_fail
351+
/// let result_future = async {
352+
/// let deserialized_parameters: $inputBuilderType = serde_json::from_str(&json_string).unwrap();
353+
/// client.$fnName().set_fields(&deserialized_parameters).send().await
354+
/// };
355+
/// ```
356+
pub fn set_fields(mut self, data: $inputBuilderType) -> Self {
357+
self.inner = data;
358+
self
359+
}
360+
""",
361+
"AwsSdkUnstableAttribute" to Attribute.AwsSdkUnstableAttribute.inner,
362+
)
363+
}
364+
338365
PaginatorGenerator.paginatorType(codegenContext, generics, operation, retryClassifier)?.also { paginatorType ->
339366
rustTemplate(
340367
"""

codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,13 @@ class Attribute(val inner: Writable) {
467467
public fun SerdeDeserialize(): Attribute {
468468
return Attribute(cfgAttr(all(writable("aws_sdk_unstable"), feature("serde-deserialize")), derive(RuntimeType.SerdeDeserialize)))
469469
}
470+
public fun SerdeSkip(): Attribute {
471+
return Attribute(cfgAttr(all(writable("aws_sdk_unstable"), any(feature("serde-serialize"), feature("serde-deserialize"))), serde("skip")))
472+
}
473+
474+
public fun SerdeSerializeOrDeserialize(): Attribute {
475+
return Attribute(cfg(all(writable("aws_sdk_unstable"), any(feature("serde-serialize"), feature("serde-deserialize")))))
476+
}
470477

471478
companion object {
472479
val AllowClippyBoxedLocal = Attribute(allow("clippy::boxed_local"))
@@ -530,6 +537,7 @@ class Attribute(val inner: Writable) {
530537
fun allow(lints: Collection<String>): Writable = macroWithArgs("allow", *lints.toTypedArray())
531538
fun allow(vararg lints: String): Writable = macroWithArgs("allow", *lints)
532539
fun deny(vararg lints: String): Writable = macroWithArgs("deny", *lints)
540+
fun serde(vararg lints: String): Writable = macroWithArgs("serde", *lints)
533541
fun any(vararg attrMacros: Writable): Writable = macroWithArgs("any", *attrMacros)
534542
fun cfg(vararg attrMacros: Writable): Writable = macroWithArgs("cfg", *attrMacros)
535543
fun cfg(vararg attrMacros: String): Writable = macroWithArgs("cfg", *attrMacros)

codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,11 +212,11 @@ class BuilderGenerator(
212212

213213
private fun renderBuilder(writer: RustWriter) {
214214
writer.docs("This is the datatype returned when calling `Builder::build()`.")
215-
writer.rustInline("pub type OutputShape = #T;", structureSymbol)
215+
writer.rustInline("##[allow(dead_code)] pub type OutputShape = #T;", structureSymbol)
216216
writer.docs("A builder for #D.", structureSymbol)
217217
metadata.additionalAttributes.render(writer)
218218
Attribute(derive(builderDerives)).render(writer)
219-
RenderSerdeAttribute.forStructureShape(writer, shape, model)
219+
RenderSerdeAttribute.forBuilders(writer, shape, model)
220220
SensitiveWarning.addDoc(writer, shape)
221221
writer.rustBlock("pub struct $builderName") {
222222
// add serde
@@ -225,6 +225,7 @@ class BuilderGenerator(
225225
// All fields in the builder are optional.
226226
val memberSymbol = symbolProvider.toSymbol(member).makeOptional()
227227
SensitiveWarning.addDoc(writer, member)
228+
RenderSerdeAttribute.skipIfStream(writer, member, model)
228229
renderBuilderMember(this, memberName, memberSymbol)
229230
}
230231
writeCustomizations(customizations, BuilderSection.AdditionalFields(shape))

codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGenerator.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,18 @@ class CargoTomlGenerator(
7474
.associate { it.name to it.toMap() },
7575
"dev-dependencies" to dependencies.filter { it.scope == DependencyScope.Dev }
7676
.associate { it.name to it.toMap() },
77-
"target.'cfg(aws_sdk_unstable)'.dependencies" to dependencies.filter { it.scope == DependencyScope.CfgUnstable }
77+
"target.'cfg(aws_sdk_unstable)'.dependencies" to dependencies.filter {
78+
it.scope == DependencyScope.CfgUnstable
79+
}
7880
.associate { it.name to it.toMap() },
7981
"features" to cargoFeatures.toMap(),
8082
).deepMergeWith(manifestCustomizations)
8183

82-
writer.writeWithNoFormatting(TomlWriter().write(cargoToml))
84+
// NOTE: without this it will produce ["target.'cfg(aws_sdk_unstable)'.dependencies"]
85+
// In JSON, this is an equivalent of: {"target.'cfg(aws_sdk_unstable)'.dependencies" : ...}
86+
// To make it work, it has to be: {"target": {'cfg(aws_sdk_unstable)': {"dependencies": ...}}}
87+
// This piece of code fixes it.
88+
var tomlString = TomlWriter().write(cargoToml).replace("\"target.'cfg(aws_sdk_unstable)'.dependencies\"", "target.'cfg(aws_sdk_unstable)'.dependencies")
89+
writer.writeWithNoFormatting(tomlString)
8390
}
8491
}

codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/RenderSerdeAttribute.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,44 @@
66
package software.amazon.smithy.rust.codegen.core.smithy.generators
77

88
import software.amazon.smithy.model.Model
9+
import software.amazon.smithy.model.shapes.MemberShape
910
import software.amazon.smithy.model.shapes.StructureShape
1011
import software.amazon.smithy.rust.codegen.core.rustlang.Attribute
1112
import software.amazon.smithy.rust.codegen.core.rustlang.RustWriter
13+
import software.amazon.smithy.rust.codegen.core.rustlang.raw
1214
import software.amazon.smithy.rust.codegen.core.util.isEventStream
15+
import software.amazon.smithy.rust.codegen.core.util.isStreaming
1316

17+
// Part of RFC30
1418
public object RenderSerdeAttribute {
1519
public fun forStructureShape(writer: RustWriter, shape: StructureShape, model: Model) {
1620
if (shape.members().none { it.isEventStream(model) }) {
1721
writeAttributes(writer)
1822
}
1923
}
2024

25+
public fun forBuilders(writer: RustWriter, shape: StructureShape, model: Model) {
26+
if (shape.members().none { it.isEventStream(model) }) {
27+
writeAttributes(writer)
28+
}
29+
}
30+
31+
public fun skipIfStream(writer: RustWriter, member: MemberShape, model: Model) {
32+
if (member.isEventStream(model)) {
33+
return
34+
}
35+
if (member.isStreaming(model)) {
36+
Attribute("").SerdeSkip().render(writer)
37+
}
38+
}
39+
40+
public fun importSerde(writer: RustWriter) {
41+
// we need this for skip serde to work
42+
Attribute.AllowUnusedImports.render(writer)
43+
Attribute("").SerdeSerializeOrDeserialize().render(writer)
44+
writer.raw("use serde;")
45+
}
46+
2147
public fun writeAttributes(writer: RustWriter) {
2248
Attribute("").SerdeSerialize().render(writer)
2349
Attribute("").SerdeDeserialize().render(writer)

codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,13 +154,13 @@ open class StructureGenerator(
154154

155155
open fun renderStructureMember(writer: RustWriter, member: MemberShape, memberName: String, memberSymbol: Symbol) {
156156
writer.renderMemberDoc(member, memberSymbol)
157-
SensitiveWarning.addDoc(writer, shape)
158157
writer.deprecatedShape(member)
159158
memberSymbol.expectRustMetadata().render(writer)
160159
writer.write("$memberName: #T,", memberSymbol)
161160
}
162161

163162
open fun renderStructure() {
163+
RenderSerdeAttribute.importSerde(writer)
164164
val symbol = symbolProvider.toSymbol(shape)
165165
val containerMeta = symbol.expectRustMetadata()
166166
writer.documentShape(shape, model)
@@ -172,6 +172,7 @@ open class StructureGenerator(
172172
writer.rustBlock("struct $name ${lifetimeDeclaration()}") {
173173
writer.forEachMember(members) { member, memberName, memberSymbol ->
174174
SensitiveWarning.addDoc(writer, shape)
175+
RenderSerdeAttribute.skipIfStream(writer, member, model)
175176
renderStructureMember(writer, member, memberName, memberSymbol)
176177
}
177178
writeCustomizations(customizations, StructureSection.AdditionalFields(shape))

codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGeneratorTest.kt

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -42,32 +42,4 @@ class CargoTomlGeneratorTest {
4242
}
4343
project.compileAndTest()
4444
}
45-
46-
@Test
47-
fun `check serde features`() {
48-
val project = TestWorkspace.testProject()
49-
/*
50-
["target.'cfg(aws_sdk_unstable)'.dependencies".serde]
51-
version = "1.0"
52-
features = ["derive"]
53-
serde-serialize = ["aws-smithy-types/serde-serialize"]
54-
serde-deserialize = ["aws-smithy-types/serde-deserialize"]
55-
*/
56-
project.lib {
57-
addDependency(CargoMetadata)
58-
unitTest(
59-
"smithy_codegen_serde_features",
60-
"""
61-
let metadata = cargo_metadata::MetadataCommand::new()
62-
.exec()
63-
.expect("could not run `cargo metadata`");
64-
65-
let features = &metadata.root_package().expect("missing root package").features;
66-
67-
assert_eq!(features.get("aws-aws-smithy-types"), Some(vec!["serde-serialize", "serde-deserialize"]));
68-
""",
69-
)
70-
}
71-
project.compileAndTest()
72-
}
7345
}

rust-runtime/aws-smithy-types/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ ryu = "1.0.5"
1414
time = { version = "0.3.4", features = ["parsing"] }
1515
base64-simd = "0.8"
1616

17-
[target.'cfg(aws_sdk_unstable)'.dependencies.serde]
17+
18+
[target."cfg(aws_sdk_unstable)".dependencies.serde]
1819
version = "1"
1920
features = ["derive"]
20-
optional = true
2121

2222
[dev-dependencies]
2323
base64 = "0.13.0"

0 commit comments

Comments
 (0)