package Ġio . in ap in ch . pipeline . operations Ċ Ċ import Ġcom . fasterxml . jackson . annotation . Json Sub Types Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Type Ċ Ċ data Ġclass ĠCommand Usage ( val Ġcommand : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarguments : ĠList < Command Argument > Ġ= ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Type : ĠList < DataType >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Type : ĠList < DataType >) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġall (): ĠList < Command Usage > Ġ Ġ= ĠOperation :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getAnnotation ( Json Sub Types :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. value . map Ġ{ Ġcommand Usage ( it . value ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġcommand Usage ( type : ĠK Class < *> ): ĠCommand Usage Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġtype . simple Name !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Types Ġ= Ġtype . sup ert ypes ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCommand Usage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= Ġcommand , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Type Ġ= Ġinput Type ( command , Ġparent Types ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Type Ġ= Ġoutput Type ( command , Ġparent Types ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġif ( type . construct ors . isEmpty ()) ĠlistOf () Ġelse ĠCommand Argument . from ( type . construct ors . first ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġinput Type ( command : ĠString , Ġparent Types : ĠList < K Type >) Ġ: ĠList < DataType > Ġ= Ġwhen ( command ) Ċ { ĊĠĠĠ Ġ" Start " Ġ-> Ġ ĠDataType . of ( DataType . NONE ) ĊĠĠĠ Ġ" Run " Ġ-> Ġ ĠDataType . of ( DataType . UUID ) ĊĠĠĠ Ġ" Get Html " Ġ-> Ġ ĠDataType . of ( DataType . URL ) ĊĠĠĠ Ġ" Get Json " Ġ-> Ġ ĠDataType . of ( DataType . URL ) ĊĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( parent Types . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDataType . from ( parent Types . first (). arguments [ 0 ]. type !! ) ĊĠĠĠĠĠĠĠ Ġelse Ġ ĠDataType . of ( DataType . ANY ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġoutput Type ( command : ĠString , Ġparent Types : ĠList < K Type >) Ġ: ĠList < DataType > Ġ= Ġwhen ( command ) Ċ { ĊĠĠĠ Ġ" Run " Ġ-> ĠDataType . of ( DataType . ANY ) ĊĠĠĠ Ġ" Start " Ġ-> Ġ ĠDataType . of ( DataType . ANY ) ĊĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( parent Types . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDataType . from ( parent Types . first (). arguments [ 1 ]. type !! ) ĊĠĠĠĠĠĠĠ Ġelse ĠDataType . of ( DataType . ANY ) ĊĠĠĠ Ġ} Ċ }