/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠThe ĠB azel ĠAuthors . ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* Ġ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* Ġ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġio . bazel . kotlin . builder . utils Ċ Ċ import Ġjava . io . File Ċ Ċ class ĠArg Map ( private Ġval Ġmap : ĠMap < String , ĠList < String >>) Ġ{ ĊĠ Ġ/** ĊĠĠ Ġ* ĠGet Ġthe Ġmandatory Ġsingle Ġvalue Ġfrom Ġa Ġkey ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġmandatory Single ( key : ĠString ): ĠString Ġ= ĊĠĠĠ Ġoptional Single ( key ) Ġ?: Ġthrow ĠIllegalArgumentException ("$ key Ġis Ġnot Ġoptional ") ĊĊĠ Ġprivate Ġfun Ġlabel Dep Map ( key : ĠString ) Ġ= ĊĠĠĠ Ġoptional ( key ) ĊĠĠĠĠĠ Ġ? . as Sequence () ĊĠĠĠĠĠ Ġ? . window ed ( 2 , Ġ 2 ) ĊĠĠĠĠĠ Ġ? . map Ġ{ Ġit [ 0 ] Ġto Ġit [ 1 ] Ġ} ĊĠĠĠĠĠ Ġ? . toMap () ĊĠĠĠ Ġ?: Ġempty Map () ĊĊĠ Ġprivate Ġfun Ġoptional Single ( key : ĠString ): ĠString ? Ġ= ĊĠĠĠ Ġoptional ( key )?. let Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( it . size ) Ġ{ ĊĠĠĠĠĠĠĠĠ 0 Ġ-> Ġthrow ĠIllegalArgumentException ("$ key Ġdid Ġnot Ġhave Ġa Ġvalue ") ĊĠĠĠĠĠĠĠĠ 1 Ġ-> Ġit [ 0 ] ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException ("$ key Ġshould Ġhave Ġa Ġsingle Ġvalue : Ġ$ it ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġoptional Single If ( key : ĠString , Ġcondition : Ġ() Ġ-> ĠBoolean ): ĠString ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( condition ()) Ġ{ ĊĠĠĠĠĠ Ġoptional Single ( key ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġmandatory Single ( key ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhas All ( keys : ĠArray < String >): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkeys . all Ġ{ Ġoptional ( it )?. isNotEmpty () Ġ?: Ġfalse Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhas Any ( keys : ĠArray < String >): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġkeys . any Ġ{ Ġoptional ( it )?. isNotEmpty () Ġ?: Ġfalse Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmandatory ( key : ĠString ): ĠList < String > Ġ= Ġoptional ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ key Ġis Ġnot Ġoptional " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠ Ġprivate Ġfun Ġoptional ( key : ĠString ): ĠList < String >? Ġ= Ġmap [ key ] ĊĊĠ Ġfun Ġmandatory Single ( key : ĠFlag ) Ġ= Ġmandatory Single ( key . flag ) ĊĠ Ġfun Ġoptional Single ( key : ĠFlag ) Ġ= Ġoptional Single ( key . flag ) ĊĠ Ġfun Ġoptional Single If ( key : ĠFlag , Ġcondition : Ġ() Ġ-> ĠBoolean ) Ġ= ĊĠĠĠ Ġoptional Single If ( key . flag , Ġcondition ) ĊĊĠ Ġfun Ġhas All ( var arg Ġkeys : ĠFlag ) Ġ= Ġhas All ( keys . map ( Flag :: flag ). to Typed Array ()) ĊĠ Ġfun Ġhas Any ( var arg Ġkeys : ĠFlag ) Ġ= Ġhas Any ( keys . map ( Flag :: flag ). to Typed Array ()) ĊĠ Ġfun Ġmandatory ( key : ĠFlag ) Ġ= Ġmandatory ( key . flag ) ĊĠ Ġfun Ġoptional ( key : ĠFlag ) Ġ= Ġoptional ( key . flag ) ĊĠ Ġfun Ġlabel Dep Map ( key : ĠFlag ) Ġ= Ġlabel Dep Map ( key . flag ) Ċ } Ċ Ċ interface ĠFlag Ġ{ ĊĠ Ġval Ġflag : ĠString Ċ } Ċ Ċ object ĠArg Maps Ġ{ ĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom ( args : ĠList < String >): ĠArg Map Ġ= ĊĠĠĠ Ġmutable Map Of < String , ĠMutable List < String >>() ĊĠĠĠĠĠ Ġ. also Ġ{ Ġargs ToMap ( args , Ġit ) Ġ} ĊĠĠĠĠĠ Ġ. let (:: Arg Map ) ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom ( file : ĠFile ): ĠArg Map Ġ= Ġfrom ( file . reader (). read Lines ()) ĊĊĠ Ġprivate Ġfun Ġargs ToMap ( ĊĠĠĠ Ġargs : ĠList < String >, ĊĠĠĠ Ġarg Map : ĠMutable Map < String , ĠMutable List < String >>, ĊĠĠĠ Ġis Flag : Ġ( String ) Ġ-> ĠBoolean Ġ= Ġ{ Ġit . startsWith ("-- ") Ġ} ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġvar Ġcurrent Key : ĠString Ġ= ĊĠĠĠĠĠ Ġargs . first (). also Ġ{ Ġrequire ( is Flag ( it )) Ġ{ Ġ" first Ġarg Ġmust Ġbe Ġa Ġflag " Ġ} Ġ} ĊĠĠĠ Ġval Ġcurrent Value Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġval Ġmerge Current Ġ= Ġ{ ĊĠĠĠĠĠ Ġarg Map . compute If Absent ( current Key ) Ġ{ Ġmutable ListOf () Ġ}. addAll ( current Value ) ĊĠĠĠĠĠ Ġcurrent Value . clear () ĊĠĠĠ Ġ} ĊĠĠĠ Ġargs . drop ( 1 ). forEach Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it . startsWith ("-- ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġmerge Current () ĊĠĠĠĠĠĠĠ Ġcurrent Key Ġ= Ġit ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Value . add ( it ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. also Ġ{ Ġmerge Current () Ġ} ĊĠ Ġ} Ċ } Ċ