@@ -7,7 +7,6 @@ package software.amazon.smithy.swift.codegen.integration
77import software.amazon.smithy.codegen.core.Symbol
88import software.amazon.smithy.model.knowledge.HttpBinding
99import software.amazon.smithy.model.knowledge.HttpBindingIndex
10- import software.amazon.smithy.model.knowledge.OperationIndex
1110import software.amazon.smithy.model.knowledge.TopDownIndex
1211import software.amazon.smithy.model.neighbor.RelationshipType
1312import software.amazon.smithy.model.neighbor.Walker
@@ -31,9 +30,6 @@ import software.amazon.smithy.model.traits.HttpQueryTrait
3130import software.amazon.smithy.model.traits.MediaTypeTrait
3231import software.amazon.smithy.model.traits.TimestampFormatTrait
3332import software.amazon.smithy.swift.codegen.ClientRuntimeTypes
34- import software.amazon.smithy.swift.codegen.Middleware
35- import software.amazon.smithy.swift.codegen.MiddlewareGenerator
36- import software.amazon.smithy.swift.codegen.ServiceGenerator
3733import software.amazon.smithy.swift.codegen.SwiftDependency
3834import software.amazon.smithy.swift.codegen.SwiftTypes
3935import software.amazon.smithy.swift.codegen.SwiftWriter
@@ -49,13 +45,16 @@ import software.amazon.smithy.swift.codegen.integration.middlewares.OperationInp
4945import software.amazon.smithy.swift.codegen.integration.middlewares.OperationInputHeadersMiddleware
5046import software.amazon.smithy.swift.codegen.integration.middlewares.OperationInputQueryItemMiddleware
5147import software.amazon.smithy.swift.codegen.integration.middlewares.OperationInputUrlPathMiddleware
48+ import software.amazon.smithy.swift.codegen.integration.middlewares.handlers.HttpBodyMiddleware
49+ import software.amazon.smithy.swift.codegen.integration.middlewares.handlers.HttpHeaderMiddleware
50+ import software.amazon.smithy.swift.codegen.integration.middlewares.handlers.HttpQueryItemMiddleware
51+ import software.amazon.smithy.swift.codegen.integration.middlewares.handlers.HttpUrlPathMiddleware
5252import software.amazon.smithy.swift.codegen.integration.serde.DynamicNodeDecodingGeneratorStrategy
5353import software.amazon.smithy.swift.codegen.integration.serde.UnionDecodeGeneratorStrategy
5454import software.amazon.smithy.swift.codegen.integration.serde.UnionEncodeGeneratorStrategy
5555import software.amazon.smithy.swift.codegen.middleware.OperationMiddlewareGenerator
5656import software.amazon.smithy.swift.codegen.model.ShapeMetadata
5757import software.amazon.smithy.swift.codegen.model.bodySymbol
58- import software.amazon.smithy.swift.codegen.model.capitalizedName
5958import software.amazon.smithy.utils.OptionalUtils
6059import java.util.Optional
6160import java.util.logging.Logger
@@ -128,11 +127,11 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
128127 // The input shape is referenced by more than one operation
129128 continue
130129 }
131- renderUrlPathMiddleware (ctx, operation )
132- renderHeaderMiddleware (ctx, operation)
133- renderQueryMiddleware (ctx, operation)
134- renderBodyMiddleware (ctx, operation)
135-
130+ val httpBindingResolver = getProtocolHttpBindingResolver (ctx, defaultContentType )
131+ HttpUrlPathMiddleware .renderUrlPathMiddleware (ctx, operation, httpBindingResolver )
132+ HttpHeaderMiddleware .renderHeaderMiddleware (ctx, operation, httpBindingResolver, defaultTimestampFormat )
133+ HttpQueryItemMiddleware .renderQueryMiddleware (ctx, operation, httpBindingResolver, defaultTimestampFormat )
134+ HttpBodyMiddleware .renderBodyMiddleware(ctx, operation, httpBindingResolver, httpProtocolBodyMiddleware())
136135 inputShapesWithHttpBindings.add(inputShapeId)
137136 }
138137 }
@@ -359,115 +358,6 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
359358 return resolved
360359 }
361360
362- private fun renderHeaderMiddleware (
363- ctx : ProtocolGenerator .GenerationContext ,
364- op : OperationShape
365- ) {
366- val opIndex = OperationIndex .of(ctx.model)
367- val httpBindingResolver = getProtocolHttpBindingResolver(ctx, defaultContentType)
368- val requestBindings = httpBindingResolver.requestBindings(op)
369- val inputShape = opIndex.getInput(op).get()
370- val outputShape = opIndex.getOutput(op).get()
371- val operationErrorName = " ${op.capitalizedName()} OutputError"
372- val inputSymbol = ctx.symbolProvider.toSymbol(inputShape)
373- val outputSymbol = ctx.symbolProvider.toSymbol(outputShape)
374- val outputErrorSymbol = Symbol .builder().name(operationErrorName).build()
375-
376- val headerBindings = requestBindings
377- .filter { it.location == HttpBinding .Location .HEADER }
378- .sortedBy { it.memberName }
379- val prefixHeaderBindings = requestBindings
380- .filter { it.location == HttpBinding .Location .PREFIX_HEADERS }
381-
382- val rootNamespace = ctx.settings.moduleName
383- val headerMiddlewareSymbol = Symbol .builder()
384- .definitionFile(" ./$rootNamespace /models/${inputSymbol.name} +HeaderMiddleware.swift" )
385- .name(inputSymbol.name)
386- .build()
387- ctx.delegator.useShapeWriter(headerMiddlewareSymbol) { writer ->
388- writer.addImport(SwiftDependency .CLIENT_RUNTIME .target)
389- val headerMiddleware = HttpHeaderMiddleware (writer, ctx, inputSymbol, outputSymbol, outputErrorSymbol, headerBindings, prefixHeaderBindings, defaultTimestampFormat)
390- MiddlewareGenerator (writer, headerMiddleware).generate()
391- }
392- }
393-
394- private fun renderQueryMiddleware (ctx : ProtocolGenerator .GenerationContext , op : OperationShape ) {
395- val opIndex = OperationIndex .of(ctx.model)
396- val httpBindingResolver = getProtocolHttpBindingResolver(ctx, defaultContentType)
397- val httpTrait = httpBindingResolver.httpTrait(op)
398- val requestBindings = httpBindingResolver.requestBindings(op)
399- val inputShape = opIndex.getInput(op).get()
400- val outputShape = opIndex.getOutput(op).get()
401- val operationErrorName = " ${op.capitalizedName()} OutputError"
402- val inputSymbol = ctx.symbolProvider.toSymbol(inputShape)
403- val outputSymbol = ctx.symbolProvider.toSymbol(outputShape)
404- val outputErrorSymbol = Symbol .builder().name(operationErrorName).build()
405- val queryBindings = requestBindings.filter { it.location == HttpBinding .Location .QUERY || it.location == HttpBinding .Location .QUERY_PARAMS }
406- val queryLiterals = httpTrait.uri.queryLiterals
407-
408- val rootNamespace = ctx.settings.moduleName
409- val headerMiddlewareSymbol = Symbol .builder()
410- .definitionFile(" ./$rootNamespace /models/${inputSymbol.name} +QueryItemMiddleware.swift" )
411- .name(inputSymbol.name)
412- .build()
413- ctx.delegator.useShapeWriter(headerMiddlewareSymbol) { writer ->
414- writer.addImport(SwiftDependency .CLIENT_RUNTIME .target)
415- val queryItemMiddleware = HttpQueryItemMiddleware (ctx, inputSymbol, outputSymbol, outputErrorSymbol, queryLiterals, queryBindings, defaultTimestampFormat, writer)
416- MiddlewareGenerator (writer, queryItemMiddleware).generate()
417- }
418- }
419-
420- private fun renderUrlPathMiddleware (ctx : ProtocolGenerator .GenerationContext , op : OperationShape ) {
421- val opIndex = OperationIndex .of(ctx.model)
422- val httpBindingResolver = getProtocolHttpBindingResolver(ctx, defaultContentType)
423- val httpTrait = httpBindingResolver.httpTrait(op)
424- val requestBindings = httpBindingResolver.requestBindings(op)
425- val pathBindings = requestBindings.filter { it.location == HttpBinding .Location .LABEL }
426- val inputShape = opIndex.getInput(op).get()
427- val outputShape = opIndex.getOutput(op).get()
428- val operationErrorName = ServiceGenerator .getOperationErrorShapeName(op)
429- val inputSymbol = ctx.symbolProvider.toSymbol(inputShape)
430- val outputSymbol = ctx.symbolProvider.toSymbol(outputShape)
431- val outputErrorSymbol = Symbol .builder().name(operationErrorName).build()
432-
433- val rootNamespace = ctx.settings.moduleName
434- val urlPathMiddlewareSymbol = Symbol .builder()
435- .definitionFile(" ./$rootNamespace /models/${inputSymbol.name} +UrlPathMiddleware.swift" )
436- .name(inputSymbol.name)
437- .build()
438- ctx.delegator.useShapeWriter(urlPathMiddlewareSymbol) { writer ->
439- writer.addImport(SwiftDependency .CLIENT_RUNTIME .target)
440- val urlPathMiddleware = HttpUrlPathMiddleware (ctx, inputSymbol, outputSymbol, outputErrorSymbol, httpTrait, pathBindings, writer)
441- MiddlewareGenerator (writer, urlPathMiddleware).generate()
442- }
443- }
444-
445- private fun renderBodyMiddleware (ctx : ProtocolGenerator .GenerationContext , op : OperationShape ) {
446- val opIndex = OperationIndex .of(ctx.model)
447- val inputShape = opIndex.getInput(op).get()
448-
449- if (shouldRenderHttpBodyMiddleware(inputShape)) {
450- val rootNamespace = ctx.settings.moduleName
451- val inputSymbol = ctx.symbolProvider.toSymbol(inputShape)
452- val headerMiddlewareSymbol = Symbol .builder()
453- .definitionFile(" ./$rootNamespace /models/${inputSymbol.name} +BodyMiddleware.swift" )
454- .name(inputSymbol.name)
455- .build()
456- ctx.delegator.useShapeWriter(headerMiddlewareSymbol) { writer ->
457- writer.addImport(SwiftDependency .CLIENT_RUNTIME .target)
458- val outputShape = opIndex.getOutput(op).get()
459- val outputSymbol = ctx.symbolProvider.toSymbol(outputShape)
460- val operationErrorName = " ${op.capitalizedName()} OutputError"
461- val outputErrorSymbol = Symbol .builder().name(operationErrorName).build()
462- val httpBindingResolver = getProtocolHttpBindingResolver(ctx, defaultContentType)
463- val requestBindings = httpBindingResolver.requestBindings(op)
464- val bodyMiddleware = httpBodyMiddleware(writer, ctx, inputSymbol, outputSymbol, outputErrorSymbol, requestBindings)
465-
466- MiddlewareGenerator (writer, bodyMiddleware).generate()
467- }
468- }
469- }
470-
471361 override fun generateProtocolClient (ctx : ProtocolGenerator .GenerationContext ) {
472362 val symbol = ctx.symbolProvider.toSymbol(ctx.service)
473363 ctx.delegator.useFileWriter(" ./${ctx.settings.moduleName} /${symbol.name} .swift" ) { writer ->
@@ -536,19 +426,8 @@ abstract class HttpBindingProtocolGenerator : ProtocolGenerator {
536426 )
537427 protected abstract fun addProtocolSpecificMiddleware (ctx : ProtocolGenerator .GenerationContext , operation : OperationShape )
538428
539- open fun shouldRenderHttpBodyMiddleware (shape : Shape ): Boolean {
540- return shape.members().filter { it.isInHttpBody() }.count() > 0
541- }
542-
543- open fun httpBodyMiddleware (
544- writer : SwiftWriter ,
545- ctx : ProtocolGenerator .GenerationContext ,
546- inputSymbol : Symbol ,
547- outputSymbol : Symbol ,
548- outputErrorSymbol : Symbol ,
549- requestBindings : List <HttpBindingDescriptor >
550- ): Middleware {
551- return HttpBodyMiddleware (writer, ctx, inputSymbol, outputSymbol, outputErrorSymbol, requestBindings)
429+ open fun httpProtocolBodyMiddleware (): HttpProtocolBodyMiddlewareGeneratorFactory {
430+ return DefaultHttpProtocolBodyMiddlewareGeneratorFactory ()
552431 }
553432
554433 /* *
0 commit comments