/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 0 8 - 2 0 1 8 ĠHa ul mont . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . ha ul mont . cli . core . commands Ċ Ċ import Ġorg . j line . reader . Comp leter Ċ /** Ċ Ġ* ĠCommand Registry Ġstores Ġhierarchy Ġof Ġcommands Ġprovided Ġby Ġplugins . Ċ Ġ* Ċ Ġ* ĠTo Ġregister Ġcommands Ġuse Ġ[ command ] Ġor Ġ[ invoke ] Ġmethods . Ċ Ġ* Ċ Ġ*/ Ċ class ĠCommands Registry Ġ{ ĊĠĠĠ Ġprivate Ġval Ġbuild ers Ġ= Ġmutable ListOf < Command Container Configuration . () Ġ-> ĠUnit >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġcommands Ġin ĠCLI Ġby Ġsetup Ġfunction . ĊĠĠĠĠ Ġ* ĠNote , Ġthat Ġall Ġsetup Ġfunctions Ġexecutes Ġl az ily Ġevery Ġtime Ġbefore Ġcommand Ġname Ġparsing . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcommand ( setup : ĠCommand Container Configuration . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuild ers . add ( setup ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġinvoke ( setup : ĠCommand Container Configuration . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcommand ( setup ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġtraverse ( visitor : ĠCommand Visitor ) Ġ{ ĊĠĠĠĠĠĠĠ ĠBase Command (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild ers . forEach Ġ{ Ġit () Ġ} ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġtraverse ( it , Ġvisitor ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtraverse ( command : ĠCommand Container , Ġvisitor : ĠCommand Visitor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcommand . commands . forEach Ġ{ Ġname , Ġsub Command Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . enter Command ( Command Record ( name , Ġsub Command . cli Command , Ġsub Command . comp leter )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtraverse ( sub Command , Ġvisitor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisitor . exit Command () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠCommand Container Configuration Ġ{ ĊĠĠĠ Ġfun Ġcommand ( name : ĠString , Ġcli Command : ĠCli Command , Ġsetup : Ġ( Command Configuration . () Ġ-> ĠUnit )? Ġ= Ġnull ) Ċ } Ċ Ċ interface ĠCommand Configuration Ġ: ĠCommand Container Configuration Ġ{ ĊĠĠĠ Ġfun Ġcomp leter ( comp leter : ĠComp leter ) Ċ } Ċ Ċ private Ġopen Ġclass ĠCommand Container Ġ: ĠCommand Container Configuration Ġ{ ĊĠĠĠ Ġinternal Ġval Ġcommands : ĠMutable Map < String , ĠCommand > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġ[ cli Command ] Ġby Ġ[ name ] Ġname . ĊĠĠĠĠ Ġ* ĠOptionally Ġallows Ġto Ġregister Ġsub - commands Ġwith Ġ[ setup ] Ġfunction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġcommand ( name : ĠString , Ġcli Command : ĠCli Command , Ġsetup : Ġ( Command Configuration . () Ġ-> ĠUnit )? ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( name . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Empty Ġnames Ġfor Ġcommands Ġare Ġnot Ġallowed " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( name Ġ! in Ġcommands ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Command Ġwith Ġsuch Ġname Ġis Ġalready Ġpresented Ġby Ġ${ commands [ name ] !!. cli Command :: class }" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcommands [ name ] Ġ= ĠCommand ( cli Command , Ġname ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup ?. let Ġ{ Ġit () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠBase Command Ġ: ĠCommand Container () Ċ Ċ private Ġclass ĠCommand ( val Ġcli Command : ĠCli Command , Ġval Ġname : ĠString , Ġvar Ġcomp leter : ĠComp leter ? Ġ= Ġnull ) Ġ: ĊĠĠĠĠĠĠĠ ĠCommand Container (), ĠCommand Configuration Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcomp leter ( comp leter : ĠComp leter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . comp leter Ġ= Ġcomp leter ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠCommand Visitor Ġ{ ĊĠĠĠ Ġfun Ġenter Command ( command : ĠCommand Record ) ĊĊĠĠĠ Ġfun Ġexit Command () Ċ } Ċ Ċ data Ġclass ĠCommand Record ( val Ġname : ĠString , Ġval Ġcli Command : ĠCli Command , Ġval Ġcomp leter : ĠComp leter ?)