package Ġkon ne kt Ċ Ċ import Ġarrow . meta . ph ases . Compiler Context Ċ Ċ fun Ġ< A Ġ: ĠSource Annotation > ĠParameter . to Typed Parameter ( annotation : ĠA ): ĠTyped Parameter < A > Ġ= ĠTyped Parameter ( annotation , Ġname , Ġtype ) Ċ Ċ interface ĠRef ined Parameters Context Ġ{ ĊĠ Ġval ĠpathParams : ĠList < Path Parameter > ĊĠ Ġval Ġbody Params : ĠList < Body Parameter > ĊĠ Ġval ĠqueryParams : ĠList < QueryParameter > ĊĠ Ġval Ġpart Params : ĠList < Part Parameter > ĊĠ Ġval Ġfield Params : ĠList < Field Parameter > ĊĠ Ġval Ġheader Params : ĠList < Header Parameter > Ċ } Ċ Ċ fun Ġ< T > ĠCompiler Context . with Ref ined Parameters ( method : ĠMethod , Ġf : ĠCompiler Context .( Ref ined Parameters Context ) Ġ-> ĠT ): ĠT Ġ{ ĊĠ Ġval ĠpathParams Ġ= Ġmutable ListOf < Path Parameter >() ĊĠ Ġval Ġbody Params Ġ= Ġmutable ListOf < Body Parameter >() ĊĠ Ġval ĠqueryParams Ġ= Ġmutable ListOf < QueryParameter >() ĊĠ Ġval Ġpart Params Ġ= Ġmutable ListOf < Part Parameter >() ĊĠ Ġval Ġfield Params Ġ= Ġmutable ListOf < Field Parameter >() ĊĠ Ġval Ġheader Params Ġ= Ġmutable ListOf < Header Parameter >() ĊĊĠ Ġmethod . params . forEach Ġ{ ĊĠĠĠ Ġwhen Ġ( it . annotation ) Ġ{ ĊĠĠĠĠĠ Ġis ĠPath Ġ-> ĠpathParams . add ( it . to Typed Parameter ( it . annotation )) ĊĠĠĠĠĠ Ġis ĠBody Ġ-> Ġbody Params . add ( Typed Parameter ( it . annotation , Ġit . name , Ġit . type )) ĊĠĠĠĠĠ Ġis ĠQuery Ġ-> ĠqueryParams . add ( Typed Parameter ( it . annotation , Ġit . name , Ġit . type )) ĊĠĠĠĠĠ Ġis ĠPart Ġ-> Ġpart Params . add ( Typed Parameter ( it . annotation , Ġit . name , Ġit . type )) ĊĠĠĠĠĠ Ġis ĠField Ġ-> Ġfield Params . add ( Typed Parameter ( it . annotation , Ġit . name , Ġit . type )) ĊĠĠĠĠĠ Ġis ĠHeader Ġ-> Ġheader Params . add ( Typed Parameter ( it . annotation , Ġit . name , Ġit . type )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġcontext Ġ= Ġobject Ġ: ĠRef ined Parameters Context Ġ{ ĊĠĠĠ Ġoverride Ġval ĠpathParams : ĠList < Path Parameter > Ġ= ĠpathParams ĊĠĠĠ Ġoverride Ġval Ġbody Params : ĠList < Body Parameter > Ġ= Ġbody Params ĊĠĠĠ Ġoverride Ġval ĠqueryParams : ĠList < QueryParameter > Ġ= ĠqueryParams ĊĠĠĠ Ġoverride Ġval Ġpart Params : ĠList < Part Parameter > Ġ= Ġpart Params ĊĠĠĠ Ġoverride Ġval Ġfield Params : ĠList < Field Parameter > Ġ= Ġfield Params ĊĠĠĠ Ġoverride Ġval Ġheader Params : ĠList < Header Parameter > Ġ= Ġheader Params ĊĠ Ġ} ĊĊĠ Ġreturn Ġf ( context ) Ċ } Ċ Ċ fun ĠCompiler Context . ref ine ( method : ĠMethod ): ĠRequest ? Ġ= Ġwith Ref ined Parameters ( method ) Ġ{ ĊĠ Ġverify Path ( method . http Verb . path , Ġit . path Params ) Ġ?: Ġreturn @ with Ref ined Parameters Ġnull ĊĊĠ Ġval Ġno Field Parameters : Ġ() Ġ-> ĠBoolean Ġ= Ġ{ ĊĠĠĠ Ġif Ġ( it . field Params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġparsing Error < Unit >( method . name . required Encoding ( Mime En codings Declaration . FORM _ URL _ ENCODE D )) ĊĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġno Part Parameters : Ġ() Ġ-> ĠBoolean Ġ= Ġ{ ĊĠĠĠ Ġif Ġ( it . part Params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġparsing Error < Unit >( method . name . required Encoding ( Mime En codings Declaration . MULTI PART )) ĊĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġval Ġno Body Parameters : Ġ( String ) Ġ-> ĠBoolean Ġ= Ġ{ Ġannotation Ġ-> ĊĠĠĠ Ġif Ġ( it . body Params . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġparsing Error < Unit >(" Method Ġ${ method . name } Ġcannot Ġhave Ġboth Ġ@ ${ annotation } Ġencoding Ġand Ġ@ Body Ġparameter ") ĊĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġwhen Ġ( method . encoding ) Ġ{ ĊĠĠĠ Ġis ĠForm Url Encoded Ġ-> Ġcompute If ( no Part Parameters , Ġ{ Ġno Body Parameters (" Form Url Encoded ") Ġ}) Ġ{ ĊĠĠĠĠĠ ĠForm Url Encoded Request ( ĊĠĠĠĠĠĠĠĠĠ Ġmethod . name , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . http Verb , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . headers , ĊĠĠĠĠĠĠĠĠĠ Ġit . field Params , ĊĠĠĠĠĠĠĠĠĠ Ġit . queryParams , ĊĠĠĠĠĠĠĠĠĠ Ġit . path Params , ĊĠĠĠĠĠĠĠĠĠ Ġit . header Params , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . returnType , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . params ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠMultip art Ġ-> Ġcompute If ( no Field Parameters , Ġ{ Ġno Body Parameters (" Multipart ") Ġ}) Ġ{ ĊĠĠĠĠĠ ĠMultip art Request ( ĊĠĠĠĠĠĠĠĠĠ Ġmethod . name , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . http Verb , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . headers , ĊĠĠĠĠĠĠĠĠĠ Ġit . part Params , ĊĠĠĠĠĠĠĠĠĠ Ġit . queryParams , ĊĠĠĠĠĠĠĠĠĠ Ġit . path Params , ĊĠĠĠĠĠĠĠĠĠ Ġit . header Params , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . returnType , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . params ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġnull Ġ-> Ġcompute If ( no Field Parameters , Ġno Part Parameters ) Ġ{ ĊĠĠĠĠĠ Ġval Ġbody Ġ= Ġwhen Ġ( it . body Params . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 0 Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠ 1 Ġ-> Ġit . body Params [ 0 ] ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn @ compute If Ġparsing Error ( method . name . se veral Body Parameters ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠSimple Request ( ĊĠĠĠĠĠĠĠĠĠ Ġmethod . name , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . http Verb , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . headers , ĊĠĠĠĠĠĠĠĠĠ Ġbody , ĊĠĠĠĠĠĠĠĠĠ Ġit . queryParams , ĊĠĠĠĠĠĠĠĠĠ Ġit . path Params , ĊĠĠĠĠĠĠĠĠĠ Ġit . header Params , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . returnType , ĊĠĠĠĠĠĠĠĠĠ Ġmethod . params ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠCompiler Context . verify Path ( path : ĠHttp Path , Ġparams : ĠList < Path Parameter >): ĠUnit ? Ġ{ ĊĠ Ġval Ġvariables Ġ= ĠPATH _ VARIABLE _ PATTERN . findAll ( path ) ĊĠ Ġval Ġvariable Names Ġ= Ġvariables . map Ġ{ Ġit . groups [ 1 ] !!. value Ġ}. toSet () ĊĠ Ġval Ġparams Names Ġ= Ġparams . map Ġ{ Ġit . annotation . placeholder Ġ}. toSet () ĊĠ Ġval Ġunused Variables Ġ= Ġvariable Names Ġ- Ġparams Names ĊĠ Ġval Ġunused Arguments Ġ= Ġparams Names Ġ- Ġvariable Names ĊĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠ Ġunused Variables . isNotEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠ Ġparsing Error (" URL ĠTemplate Ġvariables Ġ[ ${ unused Variables . join ToString ()} ] Ġhas Ġno Ġmatching Ġfunction Ġarguments ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġunused Arguments . isNotEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠ Ġparsing Error ("@ Path Ġarguments Ġ[ ${ unused Arguments . join ToString ()} ] Ġhas Ġno Ġmatching ĠURL ĠTemplate Ġvariable ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ-> ĠUnit ĊĠ Ġ} Ċ } Ċ Ċ private Ġval ĠPATH _ VARIABLE _ PATTERN Ġ= Ġ""" \{ (. + ? )} """. to Regex () Ċ