/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠLe on ĠL inh art , Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* Ġ 1 . ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ġ 2 . ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ċ Ġ* ĠĠĠ Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* Ġ 3 . ĠNeither Ġthe Ġname Ġof Ġthe Ġcopyright Ġholder Ġnor Ġthe Ġnames Ġof Ġits Ġcontributors Ċ Ġ* ĠĠĠ Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ġthis Ġsoftware Ċ Ġ* ĠĠĠ Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE Ċ Ġ* ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE Ċ Ġ* ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR Ċ Ġ* ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF Ċ Ġ* ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ Ġ* ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) Ċ Ġ* ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE Ċ Ġ* ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ @ file : Jvm Name (" Option Parser ") Ċ @ file : Suppress (" NOTH ING _ TO _ INLINE ") Ċ package Ġcom . github . the mrm il ch mann . k opt Ċ Ċ import Ġkotlin . jvm .* Ċ Ċ /** Ċ Ġ* ĠParses Ġa Ġ` CharStream ` Ġfor Ġvalues Ġtaken Ġinto Ġaccount Ġall Ġoptions Ġavailable Ġin Ċ Ġ* Ġthe Ġgiven Ġpool . Ċ Ġ* Ċ Ġ* Ġ@ receiver Ġthe Ġstream Ġto Ġbe Ġparsed Ċ Ġ* Ċ Ġ* Ġ@ param Ġpool Ġthe Ġpool Ġof Ġavailable Ġoptions Ċ Ġ* Ċ Ġ* Ġ@ return Ġan Ġimmutable Ġset Ġof Ġvalues Ġparsed Ġfrom Ġthis Ġstream Ċ Ġ* Ċ Ġ* Ġ@ throws ĠParsing Exception ĠĠĠĠ Ġif Ġan Ġerror Ġoccurred Ġwhile Ġparsing Ċ Ġ* Ġ@ throws ĠValidation Exception Ġ Ġif Ġa Ġparsed Ġvalue Ġwas Ġinvalid Ċ Ġ* Ċ Ġ* Ġ@ since Ġ 1 . 0 . 0 Ċ Ġ*/ Ċ fun ĠChar Stream . parse ( pool : ĠOption Pool ): ĠOption Set Ġ{ ĊĠĠĠ Ġval Ġvalues Ġ= Ġmutable Map Of < Any , ĠAny ?> () ĊĠĠĠ Ġval Ġ_ var arg Values Ġ= Ġlazy Ġ{ Ġmutable ListOf < Any ?> () Ġ} ĊĠĠĠ Ġval Ġvar arg Values Ġby Ġ_ var arg Values ĊĠĠĠ Ġvar Ġarg Index Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġignore Options Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġcurrent Non Whitespace () Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( last Ġ!== Ġnull Ġ&& Ġ! last !!. is Whitespace ()) Ġlast Ġelse Ġskip Ġ{ Ġ! it . is Whitespace () Ġ} ĊĊĠĠĠ Ġfun Ġappend Argument ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġpool . args [ arg Index ] ĊĠĠĠĠĠĠĠ Ġvalue . let ( arg :: parse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also ( arg :: validate Unsafe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pool . args . last () Ġ=== Ġarg Ġ&& Ġpool . is Last Var arg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg Values . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [ arg ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġarg Index Ġ= ĠMath . min ( arg Index Ġ+ Ġ 1 , Ġif Ġ( pool . is Last Var arg ) Ġpool . args . size Ġ- Ġ 1 Ġelse Ġpool . args . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwhile Ġ( current Non Whitespace () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ== Ġ'-' Ġ&& Ġ! ignore Options Ġ-> Ġwhen Ġ( next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'-' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠA Ġdouble Ġhy phen Ġdelimiter Ġmay Ġbe Ġfollowed Ġby Ġeither ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ 1 ) Ġa Ġwhitespace Ġcharacter , Ġin Ġwhich Ġcase Ġthe Ġsequence Ġis Ġinterpreted Ġas Ġoption Ġparsing Ġtermin ator , Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ 2 ) Ġan Ġalphabet ic Ġliteral , Ġin Ġwhich Ġcase Ġthe Ġliteral Ġis Ġinterpreted Ġas Ġlong Ġoption Ġtoken . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast !!. is Whitespace () Ġ-> Ġignore Options Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc L Ġ= Ġread Long Option Token () Ġ?: Ġthrow ĠParsing Exception (" Unexpected Ġcharacter : Ġ$ last ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! cL . all ( Char :: is Al phanumeric )) Ġthrow ĠParsing Exception (" A Ġlong Ġoption Ġtoken Ġmust Ġonly Ġconsist Ġof Ġal phanumeric Ġcharacters Ġ($ cL )") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoption Ġ= Ġpool . l Options [ cL ] Ġ?: Ġthrow ĠParsing Exception (" Unrecognized Ġlong Ġoption Ġtoken : Ġ\"$ cL \" ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( option Ġin Ġvalues ) Ġthrow ĠParsing Exception (" Duplicate Ġoption : Ġ$ option ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ=== Ġnull Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ== Ġ'=' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( option . is Marker Only ) Ġthrow ĠParsing Exception ("$ option Ġdoes Ġnot Ġaccept Ġa Ġvalue ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread String ( advance Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption . is Marker Only Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast !!. is Whitespace () Ġ-> Ġwhen Ġ( next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'-' ĠĠĠĠ Ġ-> Ġif Ġ( option . has Marker Value ()) Ġnull Ġelse Ġread String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠ Ġ-> Ġread String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption . parse ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoption . validate Unsafe ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [ option ] Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġif Ġ( option . has Marker Value ()) Ġvalues [ option ] Ġ= Ġoption . marker Value Ġelse Ġthrow ĠParsing Exception ("$ option Ġrequires Ġa Ġvalue Ġto Ġbe Ġspecified ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠA Ġsingle Ġhy phen Ġdelimiter Ġmay Ġbe Ġfollowed Ġby Ġeither ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ 1 ) Ġan Ġalphabet ic Ġliteral , Ġin Ġwhich Ġcase Ġthe Ġliteral Ġis Ġinterpreted Ġas Ġchain Ġof Ġshort Ġoption Ġtokens , Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ 2 ) Ġa Ġnumeric Ġliteral , Ġin Ġwhich Ġcase Ġthe Ġliteral Ġis Ġinterpreted Ġas Ġnegative Ġnumber . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc L Ġ= Ġread Short Option Token Chain Or Arg () Ġ?: Ġthrow ĠParsing Exception (" Unexpected Ġcharacter : Ġ$ last ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc L . all ( Char :: is Alphabet ic ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pool . s Options Ġ=== Ġnull ) Ġthrow ĠParsing Exception (" No Ġshort Ġoption Ġtokens Ġhave Ġbeen Ġregistered ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġc L . map Ġ{ Ġpool . s Options [ it ] Ġ?: Ġthrow ĠParsing Exception (" Unrecognized Ġshort Ġoption Ġtoken : Ġ\"$ it \" ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . forEach Indexed Ġ{ Ġi , Ġoption Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( option Ġin Ġvalues Ġ|| Ġoptions . filter Indexed Ġ{ Ġindex , Ġ_ Ġ-> Ġi Ġ!= Ġindex Ġ}. any Ġ{ Ġit Ġ=== Ġoption Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParsing Exception (" Duplicate Ġoption : Ġ$ option ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . any ( Option <* >:: is Marker Only ) Ġ&& Ġoptions . any Ġ{ Ġ! it . has Marker Value () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParsing Exception ("") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ=== Ġnull Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Ġ== Ġ'=' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options . any ( Option <* >:: is Marker Only )) Ġthrow ĠParsing Exception ("$ cL Ġcontains Ġan Ġoption Ġthat Ġdoes Ġnot Ġaccept Ġa Ġvalue ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread String ( advance Ġ= Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast !!. is Whitespace () Ġ-> Ġwhen Ġ( next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'-' ĠĠĠĠ Ġ-> Ġif Ġ( options . all ( Option <* >:: has Marker Value )) Ġnull Ġelse Ġread String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠ Ġ-> Ġif Ġ( options . any ( Option <* >:: is Marker Only )) Ġnull Ġelse Ġread String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . parse ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . validate Unsafe ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [ it ] Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġoptions . forEach Ġ{ Ġif Ġ( it . has Marker Value ()) Ġvalues [ it ] Ġ= Ġit . marker Value Ġelse Ġthrow ĠParsing Exception ("$ it Ġrequires Ġa Ġvalue Ġto Ġbe Ġspecified ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc L . all ( Char :: is Numeric ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pool . args . isEmpty ()) Ġthrow ĠParsing Exception (" No Ġarguments Ġhave Ġbeen Ġregistered ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend Argument ("- $ cL ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠParsing Exception (" Illegal Ġsequence : Ġ$ cL ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠArgument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pool . args . isEmpty ()) Ġthrow ĠParsing Exception (" No Ġarguments Ġhave Ġbeen Ġregistered ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġpool . args [ arg Index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread String ()?. let ( arg :: parse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also ( arg :: validate Unsafe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pool . args . last () Ġ=== Ġarg Ġ&& Ġpool . is Last Var arg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg Values . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [ arg ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġthrow ĠParsing Exception (" Could Ġnot Ġparse Ġargument Ġvalue ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg Index Ġ= ĠMath . min ( arg Index Ġ+ Ġ 1 , Ġif Ġ( pool . is Last Var arg ) Ġpool . args . size Ġ- Ġ 1 Ġelse Ġpool . args . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( arg Index Ġ< Ġpool . first Optional Arg Ġ&& Ġ!( pool . is Last Var arg Ġ&& Ġarg Index Ġ== Ġpool . args . size Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġthrow ĠParsing Exception (" Not Ġall Ġrequired Ġarguments Ġhave Ġbeen Ġspecified ") ĊĊĠĠĠ Ġif Ġ(_ var arg Values . isInitialized ()) Ġvalues [ pool . args . last ()] Ġ= Ġvar arg Values ĊĠĠĠ Ġreturn ĠOption Set ( pool , Ġvalues ) Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ private Ġinline Ġfun Ġ< VT > ĠArgument < VT >. validate Unsafe ( value : ĠAny ?) Ġ= Ġthis . validate ( value Ġas ĠVT ?) Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ private Ġinline Ġfun Ġ< VT > ĠOption < VT >. validate Unsafe ( value : ĠAny ?) Ġ= Ġthis . validate ( value Ġas ĠVT ?)