Skip to content

Commit

Permalink
refactor(codegen): allow payload serializer and deserializer for any …
Browse files Browse the repository at this point in the history
…shape (#594)
  • Loading branch information
aajtodd authored Mar 7, 2022
1 parent 98927b1 commit b79e1ef
Show file tree
Hide file tree
Showing 8 changed files with 28 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ fun Shape.changeNameSuffix(fromTo: Pair<String, String>): String {
* If is member shape returns target, otherwise returns self.
* @param model for loading the target shape
*/
internal fun Shape.targetOrSelf(model: Model) = when (this) {
fun Shape.targetOrSelf(model: Model): Shape = when (this) {
is MemberShape -> model.expectShape(this.target)
else -> this
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
import software.amazon.smithy.kotlin.codegen.core.withBlock
import software.amazon.smithy.kotlin.codegen.model.knowledge.SerdeIndex
import software.amazon.smithy.kotlin.codegen.model.targetOrSelf
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
import software.amazon.smithy.kotlin.codegen.rendering.protocol.toRenderingContext
import software.amazon.smithy.model.shapes.MemberShape
Expand Down Expand Up @@ -115,10 +116,10 @@ open class JsonParserGenerator(
}
}

override fun payloadDeserializer(ctx: ProtocolGenerator.GenerationContext, member: MemberShape): Symbol {
override fun payloadDeserializer(ctx: ProtocolGenerator.GenerationContext, shape: Shape): Symbol {
// re-use document deserializer (for the target shape!)
val symbol = ctx.symbolProvider.toSymbol(member)
val target = ctx.model.expectShape(member.target)
val target = shape.targetOrSelf(ctx.model)
val symbol = ctx.symbolProvider.toSymbol(shape)
val deserializeFn = documentDeserializer(ctx, target)
val fnName = symbol.payloadDeserializerName()
return symbol.payloadDeserializer(ctx.settings) { writer ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
import software.amazon.smithy.kotlin.codegen.core.withBlock
import software.amazon.smithy.kotlin.codegen.model.knowledge.SerdeIndex
import software.amazon.smithy.kotlin.codegen.rendering.protocol.HttpBindingProtocolGenerator
import software.amazon.smithy.kotlin.codegen.model.targetOrSelf
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
import software.amazon.smithy.kotlin.codegen.rendering.protocol.toRenderingContext
import software.amazon.smithy.model.shapes.MemberShape
Expand All @@ -20,7 +20,7 @@ import software.amazon.smithy.model.traits.TimestampFormatTrait

open class JsonSerializerGenerator(
// FIXME - we shouldn't need this, it's only required by JsonSerdeDescriptorGenerator because of toRenderingContext
private val protocolGenerator: HttpBindingProtocolGenerator,
private val protocolGenerator: ProtocolGenerator,
private val supportsJsonNameTrait: Boolean = true
) : StructuredDataSerializerGenerator {

Expand Down Expand Up @@ -95,10 +95,10 @@ open class JsonSerializerGenerator(
}
}

override fun payloadSerializer(ctx: ProtocolGenerator.GenerationContext, member: MemberShape): Symbol {
override fun payloadSerializer(ctx: ProtocolGenerator.GenerationContext, shape: Shape): Symbol {
// re-use document serializer (for the target shape!)
val target = ctx.model.expectShape(member.target)
val symbol = ctx.symbolProvider.toSymbol(member)
val target = shape.targetOrSelf(ctx.model)
val symbol = ctx.symbolProvider.toSymbol(shape)
val serializeFn = documentSerializer(ctx, target)
val fnName = symbol.payloadSerializerName()
return symbol.payloadSerializer(ctx.settings) { writer ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import software.amazon.smithy.codegen.core.Symbol
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
import software.amazon.smithy.model.shapes.MemberShape
import software.amazon.smithy.model.shapes.OperationShape
import software.amazon.smithy.model.shapes.Shape
import software.amazon.smithy.model.shapes.StructureShape

/**
Expand Down Expand Up @@ -51,10 +52,10 @@ interface StructuredDataParserGenerator {
* Implementations are expected to deserialize from the specific data format and return the result
*
* @param ctx the protocol generator context
* @param member the member to deserialize
* @param shape the shape or member to deserialize
* @return the generated symbol which should be a function matching the expected signature
*/
fun payloadDeserializer(ctx: ProtocolGenerator.GenerationContext, member: MemberShape): Symbol
fun payloadDeserializer(ctx: ProtocolGenerator.GenerationContext, shape: Shape): Symbol

/**
* Render function responsible for deserializing members bound to the payload for the given error shape.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import software.amazon.smithy.codegen.core.Symbol
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
import software.amazon.smithy.model.shapes.MemberShape
import software.amazon.smithy.model.shapes.OperationShape
import software.amazon.smithy.model.shapes.Shape

/**
* Responsible for rendering serialization of structured data (e.g. json, yaml, xml).
Expand Down Expand Up @@ -46,8 +47,8 @@ interface StructuredDataSerializerGenerator {
* Implementations are expected to serialize to the specific data format and return the contents as a byte array.
*
* @param ctx the protocol generator context
* @param member the member to serialize
* @param shape the shape or member to serialize
* @return the generated symbol which should be a function matching the expected signature
*/
fun payloadSerializer(ctx: ProtocolGenerator.GenerationContext, member: MemberShape): Symbol
fun payloadSerializer(ctx: ProtocolGenerator.GenerationContext, shape: Shape): Symbol
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
import software.amazon.smithy.kotlin.codegen.core.withBlock
import software.amazon.smithy.kotlin.codegen.model.knowledge.SerdeIndex
import software.amazon.smithy.kotlin.codegen.model.targetOrSelf
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
import software.amazon.smithy.kotlin.codegen.rendering.protocol.toRenderingContext
import software.amazon.smithy.model.shapes.MemberShape
Expand Down Expand Up @@ -130,10 +131,10 @@ open class XmlParserGenerator(
}
}

override fun payloadDeserializer(ctx: ProtocolGenerator.GenerationContext, member: MemberShape): Symbol {
override fun payloadDeserializer(ctx: ProtocolGenerator.GenerationContext, shape: Shape): Symbol {
// re-use document deserializer
val symbol = ctx.symbolProvider.toSymbol(member)
val target = ctx.model.expectShape(member.target)
val target = shape.targetOrSelf(ctx.model)
val symbol = ctx.symbolProvider.toSymbol(shape)
val deserializeFn = documentDeserializer(ctx, target)
val fnName = symbol.payloadDeserializerName()
return symbol.payloadDeserializer(ctx.settings) { writer ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
import software.amazon.smithy.kotlin.codegen.core.withBlock
import software.amazon.smithy.kotlin.codegen.model.hasTrait
import software.amazon.smithy.kotlin.codegen.model.knowledge.SerdeIndex
import software.amazon.smithy.kotlin.codegen.model.targetOrSelf
import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
import software.amazon.smithy.kotlin.codegen.rendering.protocol.toRenderingContext
import software.amazon.smithy.model.shapes.MemberShape
Expand Down Expand Up @@ -116,10 +117,10 @@ open class XmlSerializerGenerator(
return attributes + elements
}

override fun payloadSerializer(ctx: ProtocolGenerator.GenerationContext, member: MemberShape): Symbol {
override fun payloadSerializer(ctx: ProtocolGenerator.GenerationContext, shape: Shape): Symbol {
// re-use document serializer
val symbol = ctx.symbolProvider.toSymbol(member)
val target = ctx.model.expectShape(member.target)
val target = shape.targetOrSelf(ctx.model)
val symbol = ctx.symbolProvider.toSymbol(shape)
val serializeFn = documentSerializer(ctx, target)
val fnName = symbol.payloadSerializerName()
return symbol.payloadSerializer(ctx.settings) { writer ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,8 @@ internal class MockHttpProtocolGenerator : HttpBindingProtocolGenerator() {
name = errSymbol.errorDeserializerName()
}

override fun payloadDeserializer(ctx: ProtocolGenerator.GenerationContext, member: MemberShape): Symbol = buildSymbol {
val symbol = ctx.symbolProvider.toSymbol(member)
override fun payloadDeserializer(ctx: ProtocolGenerator.GenerationContext, shape: Shape): Symbol = buildSymbol {
val symbol = ctx.symbolProvider.toSymbol(shape)
name = symbol.payloadDeserializerName()
}
}
Expand All @@ -177,8 +177,8 @@ internal class MockHttpProtocolGenerator : HttpBindingProtocolGenerator() {
name = op.bodySerializerName()
}

override fun payloadSerializer(ctx: ProtocolGenerator.GenerationContext, member: MemberShape): Symbol = buildSymbol {
val symbol = ctx.symbolProvider.toSymbol(member)
override fun payloadSerializer(ctx: ProtocolGenerator.GenerationContext, shape: Shape): Symbol = buildSymbol {
val symbol = ctx.symbolProvider.toSymbol(shape)
name = symbol.payloadSerializerName()
}
}
Expand Down

0 comments on commit b79e1ef

Please sign in to comment.