package Ġcom . ap ure base . ar ken v . feature . cli Ċ Ċ import Ġcom . ap ure base . ar ken v . Ar ken v Ċ import Ġcom . ap ure base . ar ken v . argument . Argument Ċ import Ġcom . ap ure base . ar ken v . argument . Ar ken v Argument Ċ import Ġcom . ap ure base . ar ken v . feature . Ar ken v Feature Ċ import Ġcom . ap ure base . ar ken v . util . map Rel ax ed Ċ import Ġcom . ap ure base . ar ken v . util . put All Ċ import Ġcom . ap ure base . ar ken v . util . to Snake Case Ċ import Ġkotlin . collections . set Ċ Ċ /** Ċ Ġ* ĠProvides Ġcommand Ġline Ġargument Ġsupport . Ċ Ġ* ĠLoads Ġand Ġparses Ġthe Ġarguments Ġthat Ġwere Ġpassed Ġto Ġ[ Ar ken v ] Ġvia Ġthe Ġparse Ġfunction . Ċ Ġ*/ Ċ class ĠCli Feature Ġ: ĠAr ken v Feature Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġargs Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġoverride Ġfun ĠonLoad ( ar ken v : ĠAr ken v ) Ġ{ ĊĠĠĠĠĠĠĠ Ġargs Ġ= Ġar ken v . arg List ĊĠĠĠĠĠĠĠ Ġargs . replaceAll ( String :: map Rel ax ed ) ĊĠĠĠĠĠĠĠ Ġval Ġparsed Ġ= ĠCli ArgumentParser (). parse Arguments ( args ) ĊĠĠĠĠĠĠĠ Ġargs . clear () ĊĠĠĠĠĠĠĠ Ġargs . addAll ( parsed ) ĊĠĠĠĠĠĠĠ Ġload Cli Assignments (). let ( ar ken v :: put All ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Parse ( ar ken v : ĠAr ken v , Ġdelegate : ĠAr ken v Argument < *> ): ĠString ? Ġ= ĊĠĠĠĠĠĠĠ Ġfind Index ( delegate . argument , Ġar ken v . arg List )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġparse Cli ( it ) Ġ?: Ġif Ġ( delegate . is Boolean ) Ġparse Cli ( it Ġ- Ġ 1 ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Argument From List ( delegate , Ġit , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfinally ( ar ken v : ĠAr ken v ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBoolean Merge Parser (). find Remaining ( ar ken v , Ġargs ). forEach Ġ{ Ġ( arg , Ġbool Deleg ates ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs . remove ("- $ arg ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbool Deleg ates . forEach Ġ{ Ġit . set True () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠResp ons ible Ġfor Ġloading Ġarguments Ġthat Ġuse Ġthe Ġassignment Ġsyntax , Ġe . g . Ġkey = value ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġload Cli Assignments (): ĠMap < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġargs . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġargs [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġvalue . split (' =') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġsplit . first (). to Snake Case () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargs . remove At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ key ] Ġ= Ġsplit . get OrNull ( 1 ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( split . size Ġ== Ġ 1 Ġ&& Ġi Ġ< Ġargs . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Value Ġ= Ġargs [ i Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! next Value . startsWith ('- ')) Ġmap [ key ] Ġ= Ġargs [ i Ġ+ Ġ 1 ] Ġ// args . remove At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Cli ( index : ĠInt ): ĠString ? Ġ= Ġargs . get OrNull ( index Ġ+ Ġ 1 ) ĊĊĠĠĠ Ġprivate Ġfun Ġfind Index ( argument : ĠArgument <* >, Ġarguments : ĠList < String >): ĠInt ? Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġargument . is Main Arg Ġ-> Ġarguments . size Ġ- Ġ 2 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġargument ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. names ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( arguments :: indexOf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Ġ{ Ġit Ġ>= Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Argument From List ( delegate : ĠAr ken v Argument <* >, Ġindex : ĠInt , Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Value Argument ( index , Ġdelegate . is Boolean , Ġvalue , Ġdelegate . is Default ) ĊĠĠĠĠĠĠĠ Ġremove Name Argument ( index , Ġdelegate . argument . is Main Arg ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Name Argument ( index : ĠInt , Ġis Main Arg : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 Ġ&& Ġ! is Main Arg ) Ġargs . remove At ( index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Value Argument ( index : ĠInt , Ġis Boolean : ĠBoolean , Ġvalue : ĠAny ?, Ġdefault : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Boolean Ġ&& Ġ! default Ġ&& Ġvalue Ġ!= Ġnull ) Ġargs . remove At ( index Ġ+ Ġ 1 ) ĊĠĠĠ Ġ} Ċ } Ċ