package Ġcom . cj bo oms . fab ri kt . generators Ċ Ċ import Ġcom . cj bo oms . fab ri kt . generators . model . Jack son Model Generator . Companion . to Model Type Ċ import Ġcom . cj bo oms . fab ri kt . model . Body Parameter Ċ import Ġcom . cj bo oms . fab ri kt . model . Incoming Parameter Ċ import Ġcom . cj bo oms . fab ri kt . model . Kotlin TypeInfo Ċ import Ġcom . cj bo oms . fab ri kt . model . Request Parameter Ċ import Ġcom . cj bo oms . fab ri kt . util . Ka izen Parser Extensions . safe Name Ċ import Ġcom . cj bo oms . fab ri kt . util . Normal ised String . camel Case Ċ import Ġcom . cj bo oms . fab ri kt . util . Normal ised String . to Kotlin ParameterName Ċ import Ġcom . re pre zen . ka izen . o as parser . model 3 . MediaType Ċ import Ġcom . re pre zen . ka izen . o as parser . model 3 . Operation Ċ import Ġcom . re pre zen . ka izen . o as parser . model 3 . Parameter Ċ import Ġcom . re pre zen . ka izen . o as parser . model 3 . RequestBody Ċ import Ġcom . re pre zen . ka izen . o as parser . model 3 . Response Ċ import Ġcom . re pre zen . ka izen . o as parser . model 3 . Schema Ċ import Ġcom . squareup . kotlin po et . ClassName Ċ import Ġcom . squareup . kotlin po et . Code Block Ċ import Ġcom . squareup . kotlin po et . Fun Spec Ċ import Ġcom . squareup . kotlin po et . Parameter Spec Ċ import Ġcom . squareup . kotlin po et . Property Spec Ċ import Ġcom . squareup . kotlin po et . Type Spec Ċ import Ġcom . squareup . kotlin po et . as TypeName Ċ import Ġjava . util . function . Predicate Ċ Ċ object ĠGenerator Utils Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIt Ġresolves Ġthe ĠAPI Ġoperation Ġbody Ġrequest Ġto Ġits Ġbody Ġtype . ĠIf Ġmultiple Ġcontent Ġmedi as Ġare Ġfound , Ġthen Ġit Ġwill ĊĠĠĠĠ Ġ* Ġresolve Ġto Ġthe Ġschema Ġreference Ġof Ġthe Ġfirst Ġmedia Ġtype , Ġotherwise Ġit Ġassumes Ġno Ġrequest Ġbody Ġdefined Ġfor ĊĠĠĠĠ Ġ* Ġthe Ġgiven Ġoperation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠRequest Body . to Body Parameter Spec ( base Package : ĠString ): ĠList < Parameter Spec > Ġ= ĊĠĠĠĠĠĠĠ Ġthis . to Body Request Schema (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Type Ġ= Ġto Model Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Package Ġ= Ġbase Package , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Info Ġ= ĠKotlin TypeInfo . from ( it ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Nullable Ġ= Ġ! this . isRequired ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParameter Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Var Name (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIt Ġresolves Ġthe Ġgiven Ġeither Ġ` query ` Ġof Ġ` form ` Ġparameter Ġto Ġits Ġcorresponding Ġfunction Ġparam Ġspecification . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠParameter . to Parameter Spec ( base Package : ĠString ): ĠParameter Spec Ġ= ĊĠĠĠĠĠĠĠ ĠParameter Spec . builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name . to K Code Name (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Model Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Package Ġ= Ġbase Package , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Info Ġ= ĠKotlin TypeInfo . from ( this . schema ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Nullable Ġ= Ġ! this . isRequired Ġ&& Ġthis . schema . default Ġ== Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). build () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIt Ġconverts Ġany Ġstring Ġto Ġa Ġvariable Ġor Ġfunction Ġname Ġby Ġremoving Ġall Ġnon - letter - or - digit Ġcharacters Ġand Ġtransforms ĊĠĠĠĠ Ġ* Ġthe Ġin - between Ġresulting Ġwords Ġinto Ġ` camel Ġcase `. ĊĠĠĠĠ Ġ* Ġe . g . Ġ` GET Ġ/ my - resource / path /{ param }` Ġ-> Ġget My Resource Path Param ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠString . to K Code Name (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġde limiters Ġ= Ġthis . partition ( Char :: is Letter Or Digit ). second . toCharArray (). map ( Char :: toString ). to Typed Array () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . split To Sequence (* de limiters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull ( String :: capitalize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. join ToString ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. de capitalize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIt Ġresolves Ġthe Ġschema Ġfor Ġthe Ġgiven ĠAPI Ġoperation . ĠIf Ġmultiple Ġcontent Ġmedi as Ġare Ġfound , Ġthen Ġit Ġwill ĊĠĠĠĠ Ġ* Ġresolve Ġto Ġthe Ġschema Ġreference Ġof Ġthe Ġfirst Ġmedia Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠRequest Body . to Body Request Schema (): ĠList < Schema > Ġ= ĊĠĠĠĠĠĠĠ ĠlistOf NotNull ( this . get Primary Content MediaType ()?. value ?. schema ) ĊĊĠĠĠ Ġfun Ġmerge Parameters ( path : ĠList < Parameter >, Ġoperation : ĠList < Parameter >): ĠList < Parameter > Ġ= ĊĠĠĠĠĠĠĠ Ġpath . filter Ġ{ Ġpp Ġ-> Ġ! operation . any Ġ{ Ġop Ġ-> Ġpp . name Ġ== Ġop . name Ġ&& Ġpp .` in ` Ġ== Ġop .` in ` Ġ} Ġ} Ġ+ Ġoperation ĊĊĠĠĠ Ġfun ĠOperation . to K doc ( parameters : ĠList < Incoming Parameter >): ĠCode Block Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġk doc Ġ= ĠCode Block . builder (). add ("${ this . summary . or Empty () }\ n ${ this . description . or Empty () }\ n ") ĊĊĠĠĠĠĠĠĠ Ġparameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġk doc . add ("@ param Ġ% L Ġ% L \ n ", Ġit . name . to K Code Name (), Ġit . description . or Empty ()). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġk doc . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠType Spec . Builder . primary Properties Constructor ( var arg Ġproperties : ĠProperty Spec ): ĠType Spec . Builder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperty Specs Ġ= Ġproperties . map Ġ{ Ġit . to Builder (). initializer ( it . name ). build () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġproperty Specs . map Ġ{ ĠParameter Spec . builder ( it . name , Ġit . type ). build () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= ĠFun Spec . constructor Builder (). add Parameters ( parameters ). build () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . primary Constructor ( constructor ). add Properties ( property Specs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T > ĠFun Spec . Builder . add Optional Parameter ( ĊĠĠĠĠĠĠĠ Ġparameter Spec : ĠParameter Spec , ĊĠĠĠĠĠĠĠ Ġinput : ĠT , ĊĠĠĠĠĠĠĠ Ġpredicate : ĠPredicate < T > ĊĠĠĠ Ġ) Ġ= Ġapply Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( predicate . test ( input )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add Parameter ( parameter Spec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfunction Name ( op : ĠOperation , Ġresource : ĠString , Ġverb : ĠString ) Ġ= Ġop . operation Id ?. camel Case () Ġ?: Ġ"$ verb Ġ$ resource ". to K Code Name () ĊĊĠĠĠ Ġfun ĠSchema . to Var Name () Ġ= Ġthis . name ?. to K Code Name () Ġ?: Ġthis . to ClassName (). simple Name . to K Code Name () ĊĊĠĠĠ Ġprivate Ġfun ĠSchema . to ClassName () Ġ= ĠKotlin TypeInfo . from ( this ). model K Class . as TypeName () ĊĊĠĠĠ Ġfun ĠString . to ClassName ( base Package : ĠString ) Ġ= ĠClass Name ( packageName Ġ= Ġbase Package , Ġsimple Name Ġ= Ġthis ) ĊĊĠĠĠ Ġfun ĠRequest Body . get Primary Content MediaType (): ĠMap . Entry < String , ĠMediaType >? Ġ= ĊĠĠĠĠĠĠĠ Ġthis . content Media Types . entries . first OrNull () ĊĊĠĠĠ Ġfun ĠResponse . get Primary Content MediaType (): ĠMap . Entry < String , ĠMediaType >? Ġ= ĊĠĠĠĠĠĠĠ Ġthis . content Media Types . entries . first OrNull () ĊĊĠĠĠ Ġfun ĠResponse . has Multiple Content Media Types (): ĠBoolean Ġ= Ġthis . content Media Types . entries . size Ġ> Ġ 1 ĊĊĠĠĠ Ġfun ĠOperation . first Response (): ĠResponse ? Ġ= Ġthis . getBody Responses (). first OrNull () ĊĊĠĠĠ Ġfun ĠOperation . get Primary Content MediaType (): ĠMap . Entry < String , ĠMediaType >? Ġ= ĊĠĠĠĠĠĠĠ Ġthis . getBody Responses (). map Ġ{ Ġresponse Ġ-> Ġresponse . get Primary Content MediaType () Ġ}. first OrNull () ĊĊĠĠĠ Ġfun ĠOperation . get Primary Content MediaType Key (): ĠString ? Ġ= Ġthis . first Response ()?. get Primary Content MediaType ()?. key ĊĊĠĠĠ Ġfun ĠOperation . has Multiple Content Media Types (): ĠBoolean ? Ġ= Ġthis . first Response ()?. has Multiple Content Media Types () ĊĊĠĠĠ Ġfun ĠOperation . has Multiple Response Schemas (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Body Responses (). flatMap Ġ{ Ġit . content Media Types . values Ġ}. map Ġ{ Ġit . schema . name Ġ}. distinct (). size Ġ> Ġ 1 ĊĊĠĠĠ Ġfun ĠOperation . getPath Params (): ĠList < Parameter > Ġ= Ġthis . filter Params (" path ") ĊĊĠĠĠ Ġfun ĠOperation . get QueryParams (): ĠList < Parameter > Ġ= Ġthis . filter Params (" query ") ĊĊĠĠĠ Ġfun ĠOperation . getHeader Params (): ĠList < Parameter > Ġ= Ġthis . filter Params (" header ") ĊĊĠĠĠ Ġprivate Ġfun ĠOperation . getBody Responses (): ĠList < Response > Ġ= ĊĠĠĠĠĠĠĠ Ġthis . responses . filter Ġ{ Ġit . key Ġ!= Ġ" default " Ġ}. values . filter ( Response :: has Content Media Types ) ĊĊĠĠĠ Ġprivate Ġfun ĠOperation . filter Params ( param Type : ĠString ): ĠList < Parameter > Ġ= Ġthis . parameters . filter Ġ{ Ġit .` in ` Ġ== Ġparam Type Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof ĠIncoming Parameters , Ġordering Ġlogic Ġshould Ġbe ĊĠĠĠĠ Ġ* Ġencaps ulated Ġhere Ġto Ġensure Ġthe Ġorder Ġof Ġparameters Ġalign Ġbetween ĊĠĠĠĠ Ġ* Ġservices Ġand Ġcontrollers ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠOperation . to Incoming Parameters ( ĊĠĠĠĠĠĠĠ Ġbase Package : ĠString , ĊĠĠĠĠĠĠĠ Ġpath Parameters : ĠList < Parameter >, ĊĠĠĠĠĠĠĠ Ġextra Parameters : ĠList < Incoming Parameter >, ĊĠĠĠ Ġ): ĠList < Incoming Parameter > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġbodies Ġ= Ġrequest Body . content Media Types . values ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBody Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . schema . safe Name (). to Kotlin ParameterName (). if Empty Ġ{ Ġit . schema . to Var Name () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Body . description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Model Type ( base Package , ĠKotlin TypeInfo . from ( it . schema )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . schema ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmerge Parameters ( path Parameters , Ġparameters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Model Type ( base Package , ĠKotlin TypeInfo . from ( it . schema ), Ġis Nullable ( it )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . type . is Nullable Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdetect And Avoid Name Cl ashes ( bodies Ġ+ Ġparameters Ġ+ Ġextra Parameters ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdetect And Avoid Name Cl ashes ( parameters : ĠList < Incoming Parameter >): ĠList < Incoming Parameter > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parameters . map Ġ{ Ġit . name Ġ}. toSet (). size Ġ== Ġparameters . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparameters ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġparameters . map Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( p ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBody Parameter Ġ-> ĠBody Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" body _${ p . o as Name }". to Kotlin ParameterName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . schema , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRequest Parameter Ġ-> ĠRequest Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ p . parameter Location }_${ p . o as Name }". to Kotlin ParameterName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . original Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . parameter Location , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . type Info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . minimum , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . maximum , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . isRequired , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . explode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . defaultValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Nullable ( parameter : ĠParameter ): ĠBoolean Ġ= Ġ! parameter . isRequired Ġ&& Ġparameter . schema . default Ġ== Ġnull Ċ } Ċ