package Ġcom . coding ue . ko ops . core Ċ Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġjava . io . Print Stream Ċ import Ġjava . io . PrintWriter Ċ Ċ val ĠJson Ġ= ĠScript . Report Type . Json Ċ val ĠToString Ġ= ĠScript . Report Type . ToString Ċ Ċ @ Cli Marker Ċ open Ġclass ĠScript ( var Ġenvironment : ĠEnvironment ) Ġ: ĠCommand < Any ?> Ġ{ ĊĊ ĉ private Ġval ĠobjectMapper : ĠObjectMapper Ġ= Ġj ack son ObjectMapper () ĊĊ ĉ private Ġval Ġreport Ġ= ĠReport () Ċ ĉ var Ġreport As : ĠReport Type Ġ= ĠReport Type . Json ĊĊ ĉ enum Ġclass ĠReport Type Ġ{ Ċĉ ĉ Json , ĠToString , ĠNone Ċ ĉ } ĊĊ ĉ enum Ġclass ĠStatus Ġ{ Ċĉ ĉ Not Started , ĠCompleted , ĠSto pped Ċ ĉ } ĊĊ ĉ class ĠResult ( val Ġcommand : ĠString , Ġval Ġvalue : ĠAny ?) ĊĊ ĉ class ĠReport ( val Ġresults : ĠMutable List < Result > Ġ= Ġmutable ListOf ()) Ġ{ Ċĉ ĉ var Ġstatus : ĠStatus Ġ= ĠStatus . Not Started Ċĉ ĉ var Ġexception : ĠException ? Ġ= Ġnull Ċ ĉ } ĊĊ ĉ override Ġfun Ġdescription (): ĠString ? Ġ{ Ċĉ ĉ return Ġnull Ċ ĉ } ĊĊ ĉ override Ġfun Ġcommand Name () Ġ= Ġ" script " ĊĊ ĉ override Ġfun ĠtoString (): ĠString Ġ{ Ċĉ ĉ return Ġ" script Ġ{ Ġ${ report . results . map Ġ{ Ġit . command . toString () Ġ}} Ġ}" Ċ ĉ } ĊĊ ĉ fun Ġdeclare ( anonymous Block : Ġ() Ġ-> ĠAny , Ġanonymous D ry Run : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ): ĠAny ? Ġ{ Ċĉ ĉ return Ġdeclare ( object Ġ: ĠCommand < Any > Ġ{ Ċĉĉ ĉ override Ġfun Ġeval ( environment : ĠEnvironment ): ĠAny Ġ{ Ċĉĉĉ ĉ return Ġanonymous Block () Ċĉĉ ĉ } ĊĊĉĉ ĉ override Ġfun Ġcommand Name () Ġ= Ġ" anonymous " ĊĊĉĉ ĉ override Ġfun Ġdescription (): ĠString ? Ġ= Ġnull ĊĊĉĉ ĉ override Ġfun Ġdry Run () Ġ{ Ċĉĉĉ ĉ if Ġ( anonymous D ry Run Ġ== Ġnull ) Ġ{ Ċĉĉĉĉ ĉ println (" Executing Ġanonymous Ġ$ anonymous Block ") Ċĉĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉĉ ĉ anonymous D ry Run () Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉ ĉ }) Ċ ĉ } ĊĊ ĉ open Ġfun Ġdeclare ( command : ĠCommand < *> ): ĠAny ? Ġ{ Ċĉ ĉ return Ġif Ġ( environment . dry Run ) Ġ{ Ċĉĉ ĉ command . dry Run () Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ command . do Eval ( environment ) Ċĉ ĉ }. also Ġ{ Ċĉĉ ĉ report . results . add ( Result ( command . description () ?: Ġcommand Name (), Ġit )) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ internal Ġfun Ġapply Init ( environment : ĠEnvironment , Ġinit : ĠScript . () Ġ-> ĠAny ?): ĠScript Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ this . run ( init ) Ċĉĉ ĉ report . status Ġ= ĠStatus . Completed Ċĉ ĉ } Ġcatch Ġ( e : ĠCommand Exception ) Ġ{ Ċĉĉ ĉ if Ġ( report As Ġ!= ĠReport Type . None ) Ġ{ Ċĉĉĉ ĉ report . status Ġ= ĠStatus . Stopped Ċĉĉĉ ĉ report . exception Ġ= Ġe Ċĉĉ ĉ } Ġelse Ġ{ Ċĉĉĉ ĉ throw Ġe Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ val Ġw Ġ= Ġenvironment . print Config . writer Ġ?: ĠPrintWriter ( environment . print Config . stream ) Ċĉ ĉ when Ġ( report As ) Ġ{ Ċĉĉ ĉ Report Type . Json Ġ-> Ġ{ Ċĉĉĉ ĉ val Ġjson Node Ġ= ĠobjectMapper . value To Tree < JsonNode >( report ) Ċĉĉĉ ĉ Json PrettyPrinter ( w , Ġenvironment . print Config ). print Node ( json Node , Ġ 0 ) Ċĉĉĉ ĉ w . println () Ċĉĉĉ ĉ w . flush () Ċĉĉ ĉ } Ċĉĉ ĉ Report Type . ToString Ġ-> Ġ{ Ċĉĉĉ ĉ w . println ( report . toString ()) Ċĉĉ ĉ } Ċĉĉ ĉ else Ġ-> Ġ{ Ċĉĉĉ ĉ // ĠDo Ġnothing Ċĉĉ ĉ } Ċĉ ĉ } Ċĉ ĉ return Ġthis Ċ ĉ } ĊĊ ĉ override Ġfun Ġeval ( environment : ĠEnvironment ): ĠAny ? Ġ{ Ċĉ ĉ return Ġreport . results . last OrNull ()?. value Ċ ĉ } ĊĊ ĉ fun Ġeval All (): ĠList < Any ?> Ġ{ Ċĉ ĉ return Ġreport . results . map Ġ{ Ġit . value Ġ} Ċ ĉ } ĊĊ ĉ override Ġfun Ġdry Run (): ĠAny Ġ{ Ċĉ ĉ return Ġ"" Ċ ĉ } Ċ Ċ } Ċ