package Ġnet . a quad c . ly che e . http Ċ Ċ import Ġnet . a quad c . ly che e . http . param . Field Ċ import Ġnet . a quad c . ly che e . http . param . Fields Ċ import Ġnet . a quad c . ly che e . http . param . Header Ċ import Ġnet . a quad c . ly che e . http . param . Headers Ċ import Ġnet . a quad c . ly che e . http . param . Param Ċ import Ġnet . a quad c . ly che e . http . param . Part Ċ import Ġnet . a quad c . ly che e . http . param . Parts Ċ import Ġnet . a quad c . ly che e . http . param . Path Ċ import Ġnet . a quad c . ly che e . http . param . Query Ċ import Ġnet . a quad c . ly che e . http . param . QueryParams Ċ import Ġnet . a quad c . ly che e . http . param . Body Ċ import Ġnet . a quad c . ly che e . http . param . Resp Ċ // import Ġnet . a quad c . ly che e . http . param . Url Ċ import Ġnet . a quad c . persistence . new Set Ċ import Ġkotlin . math . min ĊĊ Ċ @ Published Api Ġinternal Ġclass ĠEndpoint N < ĊĠĠĠ ĠM Ġ: ĠHttpMethod < P >, ĠP Ġ: ĠParam <* >, ĠP 1 Ġ: ĠP , ĠP 2 Ġ: ĠP , ĠP 3 Ġ: ĠP , ĠP 4 Ġ: ĠP , ĠP 5 Ġ: ĠP , ĠP 6 Ġ: ĠP , ĠP 7 Ġ: ĠP , ĠP 8 Ġ: ĠP , ĠR ĊĠĠĠ Ġ>( ĊĠĠĠ Ġoverride Ġval Ġmethod : ĠM , ĊĠĠĠ Ġoverride Ġval Ġurl Template : ĠCharSequence /* ? */, ĊĠĠĠ Ġoverride Ġval Ġparams : ĠArray < out ĠParam <* >>, ĊĠĠĠ Ġoverride Ġval Ġresponse : ĠResp < R > Ċ ) Ġ: ĠEndpoint 0 < M , ĠR > ĊĠ Ġ, ĠEndpoint 1 < M , ĠP , ĠR > ĊĠ Ġ, ĠEndpoint 2 < M , ĠP , ĠP 1 , ĠP 2 , ĠR > ĊĠ Ġ, ĠEndpoint 3 < M , ĠP , ĠP 1 , ĠP 2 , ĠP 3 , ĠR > ĊĠ Ġ, ĠEndpoint 4 < M , ĠP , ĠP 1 , ĠP 2 , ĠP 3 , ĠP 4 , ĠR > ĊĠ Ġ, ĠEndpoint 5 < M , ĠP , ĠP 1 , ĠP 2 , ĠP 3 , ĠP 4 , ĠP 5 , ĠR > ĊĠ Ġ, ĠEndpoint 6 < M , ĠP , ĠP 1 , ĠP 2 , ĠP 3 , ĠP 4 , ĠP 5 , ĠP 6 , ĠR > ĊĠ Ġ, ĠEndpoint 7 < M , ĠP , ĠP 1 , ĠP 2 , ĠP 3 , ĠP 4 , ĠP 5 , ĠP 6 , ĠP 7 , ĠR > ĊĠ Ġ, ĠEndpoint 8 < M , ĠP , ĠP 1 , ĠP 2 , ĠP 3 , ĠP 4 , ĠP 5 , ĠP 6 , ĠP 7 , ĠP 8 , ĠR > Ċ { ĊĠĠĠ Ġinit Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġvar Ġurl Idx Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġvar Ġhas Body Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġhas Part Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġhas Field Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvar Ġhas QueryParams Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġhas Fields Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġhas Headers Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġhas Parts Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġvar Ġunhandled Paths : ĠMutable Set < String >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġ` idx After { ` Ġ= Ġurl Template . indexOf ('{ ') Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġif Ġ(` idx After { ` Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunhandled Paths Ġ= Ġnew Set ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ` idx Of }` Ġ= Ġurl Template . indexOf (' }', Ġ` idx After { `) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(` idx Of }` Ġ< Ġ 0 ) Ġthrow ĠIllegalArgumentException () Ġ// Ġun paired Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunhandled Paths . add ( url Template . substring (` idx After { `, Ġ` idx Of }` )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( url Template . indexOf ('{ ', Ġ` idx Of }` ). also Ġ{ Ġ` idx After { ` Ġ= Ġit + 1 Ġ} Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġqueries Ġ= Ġgather QueryParam Names () ĊĠĠĠĠĠĠĠ Ġvar Ġheaders : ĠMutable Set < String >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġparams . forEach Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġp Ġ= Ġit Ġas ĠParam <* >) Ġ{ Ġ// Ġthis Ġ' use less ' Ġcast Ġhelps Ġcompiler Ġunderstand Ġthat Ġ` when ` Ġis Ġex haustive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* is ĠUrl Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url Idx Ġ!= Ġ- 1 ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Idx Ġ= Ġidx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPath < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( un handled Paths ?. remove ( p . name . toString ()) Ġ== Ġnull ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠQuery < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( queries Ġ?: Ġnew Set < String >( 4 ). also Ġ{ Ġqueries Ġ= Ġit Ġ}). add ( p . name . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠQuery Params Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has QueryParams ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas QueryParams Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠField <* >, Ġis ĠFields Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Body ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Field Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p Ġis ĠFields ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Fields ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Fields Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHeader < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( headers Ġ?: Ġnew Set < String >( 4 ). also Ġ{ Ġheaders Ġ= Ġit Ġ}). add ( p . name . toString ())) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHeaders Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Headers ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Headers Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBody Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Part Ġ|| Ġhas Body Ġ|| Ġhas Field ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Body Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPart <* >, Ġis ĠPart s < *> Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Body ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Part Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( p Ġis ĠPart s <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Parts ) Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Parts Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! un handled Paths . isNull OrEmpty ()) Ġthrow ĠIllegalArgumentException ( un handled Paths . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Synt hetic Ġinternal Ġfun Ġgather QueryParam Names (): ĠMutable Set < String >? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġqueries : ĠMutable Set < String >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġurl Template . indexOf (' ? '). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart Ġ= Ġit Ġ+ Ġ 1 Ġ// Ġeither Ġindex Ġafter Ġ' ?' Ġor Ġzero ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġurl Template . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( start Ġ> Ġ 0 Ġ&& Ġstart Ġ< Ġend ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Of Equ Ġ= Ġurl Template . indexOf (' =', Ġstart ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Of Amp Ġ= Ġurl Template . indexOf ('& ', Ġstart ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Of Div isor Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Of Equ Ġ< Ġ 0 Ġ&& Ġidx Of Amp Ġ< Ġ 0 Ġ-> Ġend ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Of Equ Ġ< Ġ 0 Ġ-> Ġidx Of Amp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Of Amp Ġ< Ġ 0 Ġ-> Ġidx Of Equ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmin ( idx Of Equ , Ġidx Of Amp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start Ġ!= Ġidx Of Div isor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueries Ġ= Ġ( queries Ġ?: Ġnew Set ( 4 )). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add ( url Template . sub Sequence ( start , Ġidx Of Div isor ). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ// Ġeven Ġduplicate Ġquery Ġparam Ġnames Ġare ĠOK . ĠBut Ġdon 't Ġallow Ġthem Ġto Ġcol lide Ġwith Ġour Ġ` params ` Ġlater ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Of Amp Ġ< Ġ 0 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġidx Of Amp Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġqueries ĊĠĠĠ Ġ} Ċ } Ċ