/* Ċ Ġ* ĠCopyright ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 . Ċ Ġ*/ Ċ package Ġsoftware . amazon . smithy . swift . codegen . integration Ċ Ċ import Ġsoftware . amazon . smithy . codegen . core . Symbol Ċ import Ġsoftware . amazon . smithy . model . Model Ċ import Ġsoftware . amazon . smithy . model . knowledge . Operation Index Ċ import Ġsoftware . amazon . smithy . model . knowledge . Top Down Index Ċ import Ġsoftware . amazon . smithy . model . shapes . Operation Shape Ċ import Ġsoftware . amazon . smithy . swift . codegen . Client Runtime Types Ċ import Ġsoftware . amazon . smithy . swift . codegen . Service Generator Ċ import Ġsoftware . amazon . smithy . swift . codegen . Swift Dependency Ċ import Ġsoftware . amazon . smithy . swift . codegen . Swift Types Ċ import Ġsoftware . amazon . smithy . swift . codegen . Swift Writer Ċ import Ġsoftware . amazon . smithy . swift . codegen . integration . middle wares . handlers . Middleware Shape Utils Ċ import Ġsoftware . amazon . smithy . swift . codegen . middleware . Middleware Execution Generator Ċ import Ġsoftware . amazon . smithy . swift . codegen . middleware . Operation Middleware Ċ import Ġsoftware . amazon . smithy . swift . codegen . model . camel Case Name Ċ import Ġsoftware . amazon . smithy . swift . codegen . model . capital ized Name Ċ Ċ /** Ċ Ġ* ĠR enders Ġan Ġimplementation Ġof Ġa Ġservice Ġinterface Ġfor ĠHTTP Ġprotocol Ċ Ġ*/ Ċ open Ġclass ĠHttp Protocol Client Generator ( ĊĠĠĠ Ġprivate Ġval Ġctx : ĠProtocol Generator . Generation Context , ĊĠĠĠ Ġprivate Ġval Ġwriter : ĠSwift Writer , ĊĠĠĠ Ġservice Config : ĠService Config , ĊĠĠĠ Ġprivate Ġval Ġhttp Binding Resolver : ĠHttp Binding Resolver , ĊĠĠĠ Ġprivate Ġval Ġdefault ContentType : ĠString , ĊĠĠĠ Ġprivate Ġval Ġhttp Protocol Custom izable : ĠHttp Protocol Custom izable , ĊĠĠĠ Ġprivate Ġval Ġoperation Middleware : ĠOperation Middleware Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmodel : ĠModel Ġ= Ġctx . model ĊĠĠĠ Ġprivate Ġval Ġsymbol Provider Ġ= Ġctx . symbol Provider ĊĠĠĠ Ġprivate Ġval Ġservice Shape Ġ= Ġctx . service ĊĠĠĠ Ġprivate Ġval Ġhttp Protocol ServiceClient Ġ= Ġhttp Protocol Custom izable . service Client ( ctx , Ġwriter , Ġservice Config ) ĊĠĠĠ Ġfun Ġrender () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġservice Symbol Ġ= Ġsymbol Provider . to Symbol ( service Shape ) ĊĠĠĠĠĠĠĠ Ġwriter . add Import ( Swift Dependency . CLIENT _ RUNTIME . target ) ĊĠĠĠĠĠĠĠ Ġwriter . add Import ( Swift Dependency . SW IFT _ LOG . target ) ĊĠĠĠĠĠĠĠ Ġwriter . add Foundation Import () ĊĠĠĠĠĠĠĠ Ġhttp Protocol Custom izable . render Internals ( ctx ) ĊĠĠĠĠĠĠĠ Ġhttp Protocol ServiceClient . render ( service Symbol ) ĊĠĠĠĠĠĠĠ Ġwriter . write ("") ĊĠĠĠĠĠĠĠ Ġrender Operations In Extension ( service Symbol ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Namespace Ġ= Ġctx . settings . moduleName ĊĠĠĠĠĠĠĠ Ġctx . deleg ator . use FileWriter ("./ $ root Namespace /${ service Symbol . name } + Async . swift ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . write ("# if Ġswift ( >= 5 . 5 ) Ġ&& Ġcan Import (_ Concurrency )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Import ( Swift Dependency . CLIENT _ RUNTIME . target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrender Async Operations In Extension ( service Symbol , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . write ("# endif ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Operations In Extension ( service Symbol : ĠSymbol ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Down Index Ġ= ĠTop Down Index . of ( model ) ĊĠĠĠĠĠĠĠ Ġval Ġoperations Ġ= Ġtop Down Index . get Cont ained Operations ( service Shape ). sorted By Ġ{ Ġit . capital ized Name () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoperations Index Ġ= ĠOperation Index . of ( model ) ĊĊĠĠĠĠĠĠĠ Ġwriter . open Block (" extension Ġ${ service Symbol . name }: Ġ${ service Symbol . name } Protocol Ġ{ ", Ġ" }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠService Generator . render Operation Definition ( model , Ġsymbol Provider , Ġwriter , Ġoperations Index , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . open Block ("{ ", Ġ" }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperation Stack Name Ġ= Ġ" operation " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerator Ġ= ĠMiddleware Execution Generator ( ctx , Ġwriter , Ġhttp Binding Resolver , Ġhttp Protocol Custom izable , Ġoperation Middleware , Ġoperation Stack Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator . render ( it ) Ġ{ Ġwriter , Ġlabel Member Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write (" completion (. failure (. client (\ $ N . serialization Failed (\" uri Ġcomponent Ġ$ label Member Name Ġunexpected ly Ġnil \" )))) ", ĠClient Runtime Types . Core . Client Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write (" return ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write (" let Ġresult Ġ= Ġ$ operation Stack Name . handle Middleware ( context : Ġcontext . build (), Ġinput : Ġinput , Ġnext : Ġclient . get Handler ()) ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write (" completion ( result )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Async Operations In Extension ( service Symbol : ĠSymbol , Ġwriter : ĠSwift Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Down Index Ġ= ĠTop Down Index . of ( model ) ĊĠĠĠĠĠĠĠ Ġval Ġoperations Ġ= Ġtop Down Index . get Cont ained Operations ( service Shape ). sorted By Ġ{ Ġit . capital ized Name () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġoperations Index Ġ= ĠOperation Index . of ( model ) ĊĠĠĠĠĠĠĠ Ġwriter . write ("@ available ( macOS Ġ 1 2 . 0 , ĠiOS Ġ 1 5 . 0 , Ġtv OS Ġ 1 5 . 0 , Ġwatch OS Ġ 8 . 0 , Ġmac C atal yst Ġ 1 5 . 0 , Ġ*) ") ĊĠĠĠĠĠĠĠ Ġwriter . open Block (" public Ġextension Ġ${ service Symbol . name } Ġ{ ", Ġ" }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠService Generator . render AsyncOperation Definition ( model , Ġsymbol Provider , Ġwriter , Ġoperations Index , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . open Block ("{ ", Ġ" }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrender Continuation ( operations Index , Ġit , Ġwriter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrender Continuation ( op Index : ĠOperation Index , Ġop : ĠOperation Shape , Ġwriter : ĠSwift Writer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoperation Name Ġ= Ġop . camel Case Name () ĊĠĠĠĠĠĠĠ Ġval Ġcontinuation Name Ġ= Ġ"${ operation Name } Continuation " ĊĠĠĠĠĠĠĠ Ġwriter . write (" type alias Ġ$ continu ation Name Ġ= ĠChecked Continuation < ${ Middleware Shape Utils . output Symbol ( ctx . symbol Provider , Ġop Index , Ġop ). name }, Ġ\$ N >", ĠSwift Types . Error ) ĊĠĠĠĠĠĠĠ Ġwriter . open Block (" return Ġtry Ġawait Ġwith Checked Throw ing Continuation Ġ{ Ġ( continu ation : Ġ$ continu ation Name ) Ġin ", Ġ" }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . open Block ("$ operation Name ( input : Ġinput ) Ġ{ Ġresult Ġin ", Ġ" }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . open Block (" switch Ġresult Ġ{ ", Ġ" }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write (" case Ġ. success ( let Ġoutput ): ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . indent (). write (" continu ation . resume ( return ing : Ġoutput ) "). ded ent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write (" case Ġ. failure ( let Ġerror ): ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . indent (). write (" continu ation . resume ( throw ing : Ġerror ) "). ded ent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ