package Ġme . s arg un vo h ra . lib . k lap Ċ Ċ import Ġme . s arg un vo h ra . lib . cake parse . api .* Ċ import Ġme . s arg un vo h ra . lib . cake parse . lexer . Token Instance Ċ import Ġme . s arg un vo h ra . lib . k lap . internal . K lap Result Ċ import Ġme . s arg un vo h ra . lib . k lap . annotation . List Arg Ċ import Ġme . s arg un vo h ra . lib . k lap . annotation . Single Arg Ċ import Ġme . s arg un vo h ra . lib . k lap . exception . K lap Invalid Arg Exception Ċ import Ġme . s arg un vo h ra . lib . k lap . exception . K lap Missing Key Exception Ċ import Ġme . s arg un vo h ra . lib . k lap . exception . K lap Missing Constructor Exception Ċ import Ġme . s arg un vo h ra . lib . k lap . internal . Arg Ċ import Ġme . s arg un vo h ra . lib . k lap . internal . K lap Grammar Ċ import Ġkotlin . reflect .* Ċ import Ġkotlin . reflect . jvm . jvm Name Ċ Ċ /** Ċ Ġ* ĠThis Ġsingleton Ġis Ġresponsible Ġfor Ġparsing Ġcommand Ġline Ġarguments . Ċ Ġ*/ Ċ object ĠK lap Ġ{ ĊĊĠĠĠ Ġprivate Ġfun ĠIterable < String >. to Tokens () Ġ= Ġmap Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . startsWith ("-- ") Ġ-> ĠToken Instance ( K lap Grammar . long Flag , Ġit . substring ( 2 ), Ġ- 1 , Ġ- 1 , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . startsWith ("- ") Ġ-> ĠToken Instance ( K lap Grammar . short Flag , Ġit . substring ( 1 ), Ġ- 1 , Ġ- 1 , Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠToken Instance ( K lap Grammar . word , Ġit , Ġ- 1 , Ġ- 1 , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. as Sequence () ĊĊĠĠĠ Ġprivate Ġfun ĠSequence < Token Instance >. to Parsed () Ġ= Ġparse ToEnd ( K lap Grammar . goal ). value ĊĊĠĠĠ Ġprivate Ġfun ĠList < Arg >. to Initial Result () Ġ= Ġfold ( K lap Result ()) Ġ{ Ġtotal , Ġarg Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ( arg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArg . Flag Args Ġ-> Ġtotal . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Args Ġ= Ġtotal . flag Args Ġ+ Ġarg . keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArg . Value Args Ġ-> Ġtotal . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Args Ġ= Ġtotal . value Args Ġ+ Ġarg . pair , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Args Ġ= Ġtotal . flag Args Ġ+ Ġarg . extra Flags . keys ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠArg . Word Args Ġ-> Ġtotal . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Args Ġ= Ġtotal . word Args Ġ+ Ġarg . values ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Arg >. to Result ( flags : ĠSet < String >, Ġkeys : ĠSet < String >): ĠK lap Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Ġ= Ġto Initial Result () ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Ġ= Ġinitial ĊĊĠĠĠĠĠĠĠ Ġval Ġhold Ġ= Ġcurrent . word Args ĊĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . copy ( word Args Ġ= Ġempty List ()) ĊĊĠĠĠĠĠĠĠ Ġcurrent . value Args . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( key , Ġvalue ) Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! keys . contains ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Args Ġ= Ġcurrent . flag Args Ġ+ Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Args Ġ= Ġcurrent . value Args . to Sorted Map (). apply Ġ{ Ġremove ( key ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword Args Ġ= Ġcurrent . word Args Ġ+ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . copy ( word Args Ġ= Ġcurrent . word Args Ġ+ Ġhold ) ĊĊĠĠĠĠĠĠĠ Ġcurrent . flag Args . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( flags . contains ( it )) Ġ{ Ġthrow ĠK lap Invalid Arg Exception ( if Ġ( it . length Ġ== Ġ 1 ) Ġ"- $ it " Ġelse Ġ"-- $ it ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTake Ġthe Ġinput Ġand Ġparse Ġit Ġas Ġcommand Ġline Ġargs , Ġand Ġconstruct Ġan Ġinstance Ġof Ġthe Ġtarget Ġclass Ġwith Ġthe Ġvalues . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput Ġthe Ġcommand Ġline Ġarguments Ġto Ġparse . ĊĠĠĠĠ Ġ* Ġ@ param Ġtarget Ġthe Ġclass Ġto Ġconstruct Ġbased Ġon Ġthe Ġarguments . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġinstance Ġof Ġthe Ġ[ target ] Ġclass ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠK lap Invalid Arg Exception Ġwhen Ġan Ġinvalid Ġargument Ġis Ġencountered Ġin Ġthe Ġ[ input ] ĊĠĠĠĠ Ġ* Ġ@ throws ĠK lap Missing Key Exception Ġwhen Ġan Ġexpected Ġkey Ġis Ġnot Ġencountered Ġin Ġthe Ġ[ input ] ĊĠĠĠĠ Ġ* Ġ@ throws ĠK lap Missing Constructor Exception Ġwhen Ġthe Ġ[ target ] Ġclass Ġdoes Ġnot Ġhave Ġa Ġprimary Ġconstructor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ< T : ĠAny > Ġparse Args ( input : ĠIterable < String >, Ġtarget : ĠK Class < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġtarget . primary Constructor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠK lap Missing Constructor Exception ( target . simple Name Ġ?: Ġtarget . jvm Name ) ĊĊĠĠĠĠĠĠĠ Ġval Ġname To Parameter Ġ= Ġhash Map Of < String , ĠK Parameter >() ĊĠĠĠĠĠĠĠ Ġconstructor . parameters . forEach Ġ{ Ġparam Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparam . annotations . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . annotation Class Ġ== ĠSingle Arg :: class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it Ġas ĠSingle Arg ). names . forEach Ġ{ Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname To Parameter . put ( name , Ġparam ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgroups Ġ= Ġname To Parameter . toList (). groupBy Ġ{ Ġit . second . type Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġflag To Parameter Ġ= Ġgroups [ Boolean :: class . default Type ]?. toMap () Ġ?: Ġempty Map () ĊĠĠĠĠĠĠĠ Ġval Ġkey To Parameter Ġ= Ġgroups [ String :: class . default Type ]?. toMap () Ġ?: Ġempty Map () ĊĠĠĠĠĠĠĠ Ġval Ġlist Parameter Ġ= Ġconstructor . parameters . find Ġ{ Ġit . annotations . any Ġ{ Ġit . annotation Class Ġ== ĠList Arg :: class Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparsed Result Ġ= Ġinput . to Tokens (). to Parsed (). to Result ( flag To Parameter . keys , Ġkey To Parameter . keys ) ĊĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= Ġlinked Map Of < K Parameter , ĠAny >() ĊĊĠĠĠĠĠĠĠ Ġflag To Parameter . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs [ it ] Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġparsed Result . flag Args . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs [ flag To Parameter [ it ] !! ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġparsed Result . value Args . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs [ key To Parameter [ it . key ] !! ] Ġ= Ġit . value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġkey To Parameter . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( it . is Optional Ġ|| Ġargs . containsKey ( it )) Ġ{ Ġthrow ĠK lap Missing Key Exception ( it . name !! ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlist Parameter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs [ it ] Ġ= Ġparsed Result . word Args ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrequire ( parsed Result . word Args . isEmpty ()) Ġ{ Ġthrow ĠK lap Invalid Arg Exception ( parsed Result . word Args [ 0 ]) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconstructor . call By ( args ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< T : ĠAny > Ġparse Args ( input : ĠArray < String >, Ġtarget : ĠK Class < T >) Ġ= Ġparse Args ( input . toList (), Ġtarget ) Ċ }