package Ġnet . cord a . tools . shell Ċ Ċ import Ġnet . cord a . core . flows . StateMachine Run Id Ċ import Ġnet . cord a . core . internal . concurrent . open Future Ċ import Ġnet . cord a . core . context . Invocation Context Ċ import Ġnet . cord a . core . messaging . StateMachine Update Ċ import Ġnet . cord a . core . messaging . StateMachine Update . Added Ċ import Ġnet . cord a . core . messaging . StateMachine Update . Removed Ċ import Ġnet . cord a . core . transactions . Signed Transaction Ċ import Ġnet . cord a . core . utilities . Try Ċ import Ġorg . cr sh . text . Color Ċ import Ġorg . cr sh . text . Decoration Ċ import Ġorg . cr sh . text . Render PrintWriter Ċ import Ġorg . cr sh . text . ui . Label Element Ċ import Ġorg . cr sh . text . ui . Overflow Ċ import Ġorg . cr sh . text . ui . Row Element Ċ import Ġorg . cr sh . text . ui . Table Element Ċ import Ġrx . Subscriber Ċ Ċ class ĠFlow Watch Print ing Subscriber ( private Ġval Ġto Stream : ĠRender PrintWriter ) Ġ: ĠSubscriber < Any >() Ġ{ ĊĠĠĠ Ġprivate Ġval Ġindex Map Ġ= ĠHashMap < StateMachine Run Id , ĠInt >() ĊĠĠĠ Ġprivate Ġval Ġtable Ġ= ĠcreateState Machines Table () ĊĠĠĠ Ġval Ġfuture Ġ= Ġopen Future < Unit >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġfuture Ġis Ġpublic Ġand Ġcan Ġbe Ġcompleted Ġby Ġsomething Ġelse Ġto Ġindicate Ġwe Ġdon 't Ġwish Ġto Ġfollow ĊĠĠĠĠĠĠĠ Ġ// Ġanymore Ġ( e . g . Ġthe Ġuser Ġpressing ĠCtrl - C ). ĊĠĠĠĠĠĠĠ Ġfuture . then Ġ{ Ġunsubscribe () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġon Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġobservable Ġof Ġstate Ġmachines Ġwill Ġnever Ġcomplete . ĊĠĠĠĠĠĠĠ Ġfuture . set ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun Ġon Next ( t : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( t Ġis ĠState Machine Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Stream . cls () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcreateState Machines Row ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Stream . print ( table ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Stream . println (" Waiting Ġfor Ġcompletion Ġor ĠCtrl - C Ġ... Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Stream . flush () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġto Stream . println (" Observable Ġcompleted Ġwith Ġan Ġerror ") ĊĠĠĠĠĠĠĠ Ġfuture . set Exception ( e ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstate Color ( update : ĠState Machine Update ): ĠColor Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAdded Ġ-> ĠColor . blue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRemoved Ġ-> Ġif Ġ( update . result . is Success ) ĠColor . green Ġelse ĠColor . red ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠcreateState Machines Table (): ĠTable Element Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtable Ġ= ĠTable Element ( 1 , Ġ 2 , Ġ 1 , Ġ 2 ). overflow ( Overflow . HIDDEN ). right Cell Padding ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġheader Ġ= ĠRow Element ( true ). add (" Id ", Ġ" Flow Ġname ", Ġ" Init iator ", Ġ" Status "). style ( Decoration . bold . fg ( Color . black ). bg ( Color . white )) ĊĠĠĠĠĠĠĠ Ġtable . add ( header ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtable ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO ĠAdd Ġprogress Ġtracker ? ĊĠĠĠ Ġprivate Ġfun ĠcreateState Machines Row ( sm m Update : ĠState Machine Update ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( sm m Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAdded Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable . add ( Row Element (). add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Element ( format Flow Id ( sm m Update . id )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Element ( format Flow Name ( sm m Update . state Machine Info . flow Logic ClassName )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Element ( format Invocation Context ( sm m Update . state Machine Info . invocation Context )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Element (" In Ġprogress ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). style ( state Color ( sm m Update ). fg ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Map [ sm m Update . id ] Ġ= Ġtable . rows . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRemoved Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġidx Ġ= Ġindex Map [ sm m Update . id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( idx Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Row Ġ= Ġtable . rows [ idx ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Name Label Ġ= Ġold Row . get Col ( 1 ) Ġas ĠLabel Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflow Init iator Label Ġ= Ġold Row . get Col ( 2 ) Ġas ĠLabel Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtable . rows [ idx ] Ġ= ĠRow Element (). add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Element ( format Flow Id ( sm m Update . id )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Element ( flow Name Label . value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Element ( flow Init iator Label . value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Element ( format Flow Result ( sm m Update . result )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). style ( state Color ( sm m Update ). fg ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Flow Name ( flow Name : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamel Case Regex Ġ= ĠRegex (" (? < =[ a - z ]) (? =[ A - Z ]) |( ?< =[ A - Z ]) (? =[ A - Z ][ a - z ]) ") ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġflow Name . split ('.', Ġ'$ '). last () ĊĠĠĠĠĠĠĠ Ġ// ĠSplit ĠCamel Case Ġand Ġget Ġrid Ġof Ġ" flow " Ġat Ġthe Ġend Ġif Ġpresent . ĊĠĠĠĠĠĠĠ Ġreturn Ġcamel Case Regex . split ( name ). filter Ġ{ Ġit . compareTo (" Flow ", Ġtrue ) Ġ!= Ġ 0 Ġ}. join ToString (" Ġ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Flow Id ( flow Id : ĠState Machine Run Id ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġflow Id . toString (). remove Sur rounding ("[ ", Ġ"] ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Invocation Context ( context : ĠInvocation Context ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . principal (). name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġformat Flow Result ( flow Result : ĠTry < *> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsuccess Format ( value : ĠAny ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSigned Transaction Ġ-> Ġ" Tx ĠID : Ġ" Ġ+ Ġvalue . id . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Ġkotlin . Unit Ġ-> Ġ" No Ġreturn Ġvalue " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ" No Ġreturn Ġvalue " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvalue . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( flow Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Success Ġ-> Ġsuccess Format ( flow Result . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTry . Failure Ġ-> Ġflow Result . exception . message Ġ?: Ġflow Result . exception . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ