package Ġcom . rx http . compiler . k sp Ċ Ċ import Ġcom . google . devtools . k sp . K sp Experimental Ċ import Ġcom . google . devtools . k sp . get Annotations ByType Ċ import Ġcom . google . devtools . k sp . get Construct ors Ċ import Ġcom . google . devtools . k sp . is Public Ċ import Ġcom . google . devtools . k sp . processing . Code Generator Ċ import Ġcom . google . devtools . k sp . processing . Dependencies Ċ import Ġcom . google . devtools . k sp . processing . K SP Logger Ċ import Ġcom . google . devtools . k sp . symbol . KS Class Declaration Ċ import Ġcom . google . devtools . k sp . symbol . KS File Ċ import Ġcom . google . devtools . k sp . symbol . KS Property Declaration Ċ import Ġcom . rx http . compiler . rx Http Package Ċ import Ġcom . rx http . compiler . rx http K ClassName Ċ import Ġcom . squareup . kotlin po et . ANY Ċ import Ġcom . squareup . kotlin po et . Code Block Ċ import Ġcom . squareup . kotlin po et . File Spec Ċ import Ġcom . squareup . kotlin po et . Fun Spec Ċ import Ġcom . squareup . kotlin po et . K Modifier Ċ import Ġcom . squareup . kotlin po et . Parameter Spec Ċ import Ġcom . squareup . kotlin po et . Parameterized TypeName . Companion . parameter ized By Ċ import Ġcom . squareup . kotlin po et . STRING Ċ import Ġcom . squareup . kotlin po et . Type Spec Ċ import Ġcom . squareup . kotlin po et . Type Variable Name Ċ import Ġcom . squareup . kotlin po et . k sp . Kotlin Po et K sp Preview Ċ import Ġcom . squareup . kotlin po et . k sp . to Type Parameter Resolver Ċ import Ġcom . squareup . kotlin po et . k sp . to Type Variable Name Ċ import Ġcom . squareup . kotlin po et . k sp . writeTo Ċ import Ġrx http . wrapper . annotation . Converter Ċ import Ġrx http . wrapper . annotation . Domain Ċ import Ġrx http . wrapper . annotation . Ok Client Ċ import Ġrx http . wrapper . annotation . Param Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ Ċ /** Ċ Ġ* ĠUser : Ġl jx Ċ Ġ* ĠDate : Ġ 2 0 2 0 / 5 / 3 0 Ċ Ġ* ĠTime : Ġ 1 9 : 0 3 Ċ Ġ*/ Ċ class ĠRx Http Wrapper ( private Ġval Ġlogger : ĠK SP Logger ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġclass Map Ġ= ĠLinkedHashMap < String , ĠWrapper >() ĊĊĠĠĠ Ġprivate Ġval Ġelement Map Ġ= ĠLinkedHashMap < String , ĠK S Class Declaration >() ĊĠĠĠ Ġprivate Ġval Ġks Files Ġ= Ġmutable Set Of < KS File >() ĊĊĠĠĠ Ġ@ Opt In ( K sp Experimental :: class ) ĊĠĠĠ Ġfun Ġadd ( ks Class Declaration : ĠK S Class Declaration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġks Class Declaration . get Annotations ByType ( Param :: class ). first OrNull () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString Ġ= Ġannotation . methodName ĊĠĠĠĠĠĠĠ Ġelement Map [ name ] Ġ= Ġks Class Declaration ĊĠĠĠĠĠĠĠ Ġks Files . add ( ks Class Declaration . containing File !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( K sp Experimental :: class ) ĊĠĠĠ Ġfun Ġadd Ok Client ( property : ĠK S Property Declaration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġok Client Ġ= Ġproperty . get Annotations ByType ( Ok Client :: class ). first OrNull () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( ok Client . className . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġwrapper Ġ= Ġclass Map [ ok Client . className ] ĊĠĠĠĠĠĠĠ Ġif Ġ( wrapper Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper Ġ= ĠWrapper () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Map [ ok Client . className ] Ġ= Ġwrapper ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( wrapper . ok Client Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"@ Ok Client Ġannotation ĠclassName Ġcannot Ġbe Ġthe Ġsame " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( msg , Ġproperty ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġok Client . name ĊĠĠĠĠĠĠĠ Ġif Ġ( name . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġproperty . simple Name . asString (). first Letter UpperCase () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwrapper . ok Client Name Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġks Files . add ( property . containing File !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( K sp Experimental :: class ) ĊĠĠĠ Ġfun Ġadd Converter ( property : ĠK S Property Declaration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconverter Ġ= Ġproperty . get Annotations ByType ( Converter :: class ). first OrNull () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( converter . className . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġwrapper Ġ= Ġclass Map [ converter . className ] ĊĠĠĠĠĠĠĠ Ġif Ġ( wrapper Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper Ġ= ĠWrapper () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Map [ converter . className ] Ġ= Ġwrapper ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( wrapper . converter Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"@ Converter Ġannotation ĠclassName Ġcannot Ġbe Ġthe Ġsame " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( msg , Ġproperty ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġconverter . name ĊĠĠĠĠĠĠĠ Ġif Ġ( name . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġproperty . simple Name . asString (). first Letter UpperCase () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwrapper . converter Name Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġks Files . add ( property . containing File !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( K sp Experimental :: class ) ĊĠĠĠ Ġfun Ġadd Domain ( property : ĠK S Property Declaration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdomain Ġ= Ġproperty . get Annotations ByType ( Domain :: class ). first OrNull () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( domain . className . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġwrapper Ġ= Ġclass Map [ domain . className ] ĊĠĠĠĠĠĠĠ Ġif Ġ( wrapper Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper Ġ= ĠWrapper () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Map [ domain . className ] Ġ= Ġwrapper ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( wrapper . domain Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ"@ Domain Ġannotation ĠclassName Ġcannot Ġbe Ġthe Ġsame " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( msg , Ġproperty ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġdomain . name ĊĠĠĠĠĠĠĠ Ġif Ġ( name . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġproperty . simple Name . asString (). first Letter UpperCase () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwrapper . domain Name Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġks Files . add ( property . containing File !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ K sp Experimental ĊĠĠĠ Ġ@ Kotlin Po et K sp Preview ĊĠĠĠ Ġfun Ġgenerate Rx Wrapper ( code Generator : ĠCode Generator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Fun List Ġ= Ġgenerate Request Fun List () ĊĊĠĠĠĠĠĠĠ Ġ// çĶŁæĪĲ å¤ļä¸ª Rx Http çļĦ åĮħ è£ħ ç±» ĊĠĠĠĠĠĠĠ Ġfor Ġ(( className , Ġwrapper ) Ġin Ġclass Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfun Body Ġ= ĠCode Block . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper . converter Name ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Body . add Statement (" set $ it () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper . ok Client Name ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Body . add Statement (" set $ it () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapper . domain Name ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Body . add Statement (" set Domain To ${ it } If Absent () ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwildcard Ġ= ĠType Variable Name ("* ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrx Http Name Ġ= Ġrx http K ClassName . parameter ized By ( wildcard , Ġwildcard ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Variable Ġ= ĠType Variable Name (" R ", Ġrx Http Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfun List Ġ= ĠArrayList < Fun Spec >() ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec . builder (" wrapper ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add K doc (" æľ¬ ç±» æīĢæľī æĸ¹æ³ķ éĥ½ä¼ļ è°ĥçĶ¨ æľ¬ æĸ¹æ³ķ \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. receiver ( type Variable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type Variable ( type Variable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code ( fun Body . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Code (" return Ġthis ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( type Variable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġfun List . add ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun List . addAll ( request Fun List ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrx Http Builder Ġ= ĠType Spec . object Builder (" Rx ${ className } Http ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add K doc ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġæľ¬ ç±» çĶ± @ Converter ãĢģ @ Domain ãĢģ @ Ok Client æ³¨è§£ ä¸ŃçļĦ className åŃĹæ®µ çĶŁæĪĲ Ġ Ġ ç±» åĳ½åĲį æĸ¹å¼ı : ĠRx Ġ+ Ġ{ className åŃĹæ®µ åĢ¼ } Ġ+ ĠHttp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGithub ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttps :// github . com / li uj ing xing / rx http ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttps :// github . com / li uj ing xing / rx life ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttps :// github . com / li uj ing xing / rx http / wiki / FAQ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttps :// github . com / li uj ing xing / rx http / wiki / æĽ´æĸ° æĹ¥å¿Ĺ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Functions ( fun List ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Spec . builder ( rx Http Package , Ġ" Rx ${ className } Http ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type ( rx Http Builder . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeTo ( code Generator , ĠDependencies ( false , Ġ* ks Files . to Typed Array ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ K sp Experimental ĊĠĠĠ Ġ@ Kotlin Po et K sp Preview ĊĠĠĠ Ġprivate Ġfun Ġgenerate Request Fun List (): ĠArrayList < Fun Spec > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfun List Ġ= ĠArrayList < Fun Spec >() Ġ// æĸ¹æ³ķ éĽĨåĲĪ ĊĠĠĠĠĠĠĠ Ġval Ġfun Map Ġ= ĠLinkedHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġfun Map [" get "] Ġ= Ġ" Rx Http No Body Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" head "] Ġ= Ġ" Rx Http No Body Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" post Body "] Ġ= Ġ" Rx Http Body Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" put Body "] Ġ= Ġ" Rx Http Body Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" patch Body "] Ġ= Ġ" Rx Http Body Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" delete Body "] Ġ= Ġ" Rx Http Body Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" post Form "] Ġ= Ġ" Rx Http Form Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" put Form "] Ġ= Ġ" Rx Http Form Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" patch Form "] Ġ= Ġ" Rx Http Form Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" delete Form "] Ġ= Ġ" Rx Http Form Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" post Json "] Ġ= Ġ" Rx Http Json Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" put Json "] Ġ= Ġ" Rx Http Json Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" patch Json "] Ġ= Ġ" Rx Http Json Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" delete Json "] Ġ= Ġ" Rx Http Json Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" post JsonArray "] Ġ= Ġ" Rx Http JsonArray Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" put JsonArray "] Ġ= Ġ" Rx Http JsonArray Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" patch JsonArray "] Ġ= Ġ" Rx Http JsonArray Param " ĊĠĠĠĠĠĠĠ Ġfun Map [" delete JsonArray "] Ġ= Ġ" Rx Http JsonArray Param " ĊĠĠĠĠĠĠĠ Ġfun Map . forEach Ġ{ Ġ( key , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFun Spec . builder ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Jvm Static :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" url ", ĠSTRING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" format Args ", ĠANY , ĠK Modifier . VAR ARG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return ĠRx Http .${ key }( url , Ġ* format Args ). wrapper () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġfun List . add ( this ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġks Class ) Ġin Ġelement Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrx Http Type Names Ġ= Ġks Class . type Parameters . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Type Variable Name () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Type Params Ġ= Ġks Class . type Parameters . to Type Parameter Resolver () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// éģįåİĨ public æŀĦéĢł æĸ¹æ³ķ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġks Class . get Construct ors (). filter Ġ{ Ġit . is Public () Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Specs Ġ= Ġarray ListOf < Parameter Spec >() Ġ// æŀĦéĢł æĸ¹æ³ķ åıĤæķ° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfun Body Ġ= ĠStringBuilder (" return ĠRx Http .$ key (" ) Ġ// æĸ¹æ³ķ ä½ĵ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Type Params Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . type Parameters . to Type Parameter Resolver ( class Type Params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġelement ) Ġin Ġit . parameters . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Spec Ġ= Ġelement . to K Parameter Spec ( function Type Params ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Specs . add ( parameter Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Body . append (", Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Body . append ( parameter Spec . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( STRING Ġ== Ġparameter Specs . first OrNull ()?. type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Body . append (", Ġ* format Args ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Body . append (" ). wrapper () ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfun Spec Builder Ġ= ĠFun Spec . builder ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Annotation ( Jvm Static :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameters ( parameter Specs ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type Variables ( rx Http Type Names ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( STRING Ġ== Ġparameter Specs . first OrNull ()?. type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Spec Builder . add Parameter (" format Args ", ĠANY , ĠK Modifier . VAR ARG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Spec Builder . add Statement ( fun Body . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġfun List . add ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfun List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠWrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġdomain Name : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġconverter Name : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġok Client Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ} Ċ }