/** Ċ Ġ* ĠCopyright Ġ 2 0 1 7 ĠModel Box ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 . model box . repl . commands Ċ Ċ import Ġcom . google . protobuf . Dynamic Message Ċ import Ġcom . google . protobuf . Message Ċ import Ġio . grpc . MethodDescriptor . MethodType . SERVER _ STREAM ING Ċ import Ġio . grpc . MethodDescriptor . MethodType . UNARY Ċ import Ġio . model box . repl . cli . Console Ċ import Ġio . model box . repl . cli . Message Reader Ċ import Ġio . model box . repl . cli . candidate Ċ import Ġio . model box . repl . cli . toJson Ċ import Ġio . model box . repl . data . Descriptor Manager Ċ import Ġio . model box . repl . data . Named Messages Ċ import Ġio . model box . repl . data . Rpc Caller Ċ import Ġio . model box . repl . data . method Type Ċ import Ġkotlinx . coroutines . experimental . Common Pool Ċ import Ġkotlinx . coroutines . experimental . channels . consume Each Ċ import Ġkotlinx . coroutines . experimental . channels . produce Ċ import Ġkotlinx . coroutines . experimental . run Blocking Ċ import Ġorg . j line . reader . Comp leter Ċ import Ġorg . j line . reader . EndOf File Exception Ċ import Ġorg . j line . reader . Parsed Line Ċ import Ġorg . j line . terminal . Terminal Ċ import Ġorg . j line . terminal . Terminal . Signal . INT Ċ import Ġjavax . inject . Inject Ċ Ċ internal Ġclass ĠRpc Command Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġconsole : ĠConsole , ĊĠĠĠ Ġprivate Ġval Ġdescriptors : ĠDescriptor Manager , ĊĠĠĠ Ġprivate Ġval Ġnamed Messages : ĠNamed Messages , ĊĠĠĠ Ġprivate Ġval Ġmessage Reader : ĠMessage Reader , ĊĠĠĠ Ġprivate Ġval Ġrpc Caller : ĠRpc Caller , ĊĠĠĠ Ġprivate Ġval Ġterminal : ĠTerminal ) Ġ: ĠCommand Ġ{ ĊĠ Ġoverride Ġval Ġhelp ĊĠĠĠ Ġget () Ġ= Ġ""" ĊĠĠĠ ĠExecute Ġan ĠRPC Ġcall . ĊĊĠĠĠ ĠIf Ġthe ĠRPC Ġis Ġa Ġclient - streaming Ġmessage , Ġthe Ġoutgoing Ġstream Ġwill Ġbe Ġcompleted ĊĠĠĠ Ġwhen Ġyou Ġtype Ġ^ D . Ġ ĠThe Ġcall Ġwill Ġbe Ġcancelled Ġon Ġa Ġ^ C . ĊĊĠĠĠ ĠUsage : ĊĠĠĠĠĠ Ġ* Ġ$ name Ġ- ĠList Ġall ĠRPC Ġmethods ĊĠĠĠĠĠ Ġ* Ġ$ name Ġ< method > Ġ- ĠCall Ġthe Ġmethod Ġusing Ġan Ġinteractive Ġeditor ĊĠĠĠĠĠ Ġ* Ġ$ name Ġ< method > Ġ< variable > Ġ- ĠCall Ġthe Ġmethod Ġusing Ġthe Ġnamed Ġvariable ĊĠĠĠĠĠ Ġ* Ġ$ name Ġ< method > Ġ< variable > Ġ< variable > Ġ.... Ġ- ĠCall Ġa Ġclient - streaming Ġmessage ĊĠ Ġ""" . trim Indent () ĊĊĠ Ġoverride Ġval Ġname ĊĠĠĠ Ġget () Ġ= Ġ" rpc " ĊĊĠ Ġoverride Ġval Ġcomp leter : ĠComp leter ĊĠĠĠ Ġget () Ġ= ĠComp leter Ġ{ Ġ_, Ġline , Ġcandidates Ġ-> ĊĠĠĠĠĠ Ġwhen Ġ( line . word Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠ 0 Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠ 1 Ġ-> Ġdescriptors . methods . forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġcandidates Ġ+= Ġcandidate ( method . fullName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġdescriptors . methods . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . fullName Ġ== Ġline . words (). get OrNull ( 1 ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn @ Comp leter ĊĊĠĠĠĠĠĠĠĠĠ Ġ// ĠFind Ġobviously - compatible Ġmessages ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcompatible Ġ= Ġnamed Messages . get (). filter Values Ġ{ Ġmsg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmsg . descriptor ForType Ġ== Ġmethod . input Type ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġcompatible . forEach Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidates Ġ+= Ġcandidate ( entry . key ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġexecute ( line : ĠParsed Line ) Ġ{ ĊĠĠĠ Ġval ĠmethodName Ġ= Ġline . words (). get OrNull ( 1 ) Ġ?: ĊĠĠĠĠĠĠĠ Ġreturn Ġdescriptors . methods . forEach Ġ{ Ġm Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġconsole . println ("${ m . fullName } Ġ- Ġ${ m . input Type . fullName } Ġ-> Ġ${ m . output Type . fullName }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmethod Ġ= Ġdescriptors . methods . first OrNull Ġ{ Ġit . fullName Ġ== ĠmethodName Ġ} Ġ?: ĊĠĠĠĠĠĠĠ Ġreturn Ġconsole . error (" Unknown Ġmethod Ġ$ methodName ") ĊĊĠĠĠ Ġ// ĠDrop Ġ" rpc Ġmethod name " ĊĠĠĠ Ġval Ġarg Names Ġ= Ġline . words (). drop ( 2 ). filter Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠ Ġval Ġargs Ġ= Ġif Ġ( arg Names . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġval Ġtype Ġ= Ġmethod . method Type ĊĊĠĠĠĠĠ Ġproduce < Message >( Common Pool ) Ġ{ ĊĠĠĠĠĠĠĠ Ġouter @ Ġwhile Ġ(! is Closed For Send ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Line Ġ= Ġmessage Reader . read ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDynamic Message . getDefaultInstance ( method . input Type )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Line . message Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnamed Messages . shift (" last ", Ġmessage Line . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend ( message Line . message ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġneed Ġone Ġvalue , Ġso Ġwe Ġcan Ġjust Ġexit Ġfrom Ġthe Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN ARY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSERVER _ STREAM ING Ġ-> Ġbreak @ outer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( message Line . parse Error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . error ( message Line . parse Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . println (" Try Ġagain Ġor Ġ^ C Ġto Ġstop ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠEnd Of File Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġproduce < Message >( Common Pool ) Ġ{ ĊĠĠĠĠĠĠĠ Ġarg Names . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġsend ( named Messages [ it ] Ġ?: Ġthrow ĠIllegalArgumentException (" Unknown Ġvariable Ġname Ġ$ it ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġval Ġinvocation Ġ= Ġrpc Caller . invoke ( method , Ġargs ) ĊĊĠĠĠĠĠ Ġval Ġold Int Ġ= Ġterminal . handle ( INT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinvocation . cancel () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġinvocation . consume Each Ġ{ Ġconsole . println ( it . toJson ( true )) Ġ} ĊĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġterminal . handle ( INT , Ġold Int ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ