@@ -738,51 +738,76 @@ func newContextWithTimeout(c *cli.Context, timeout time.Duration) (context.Conte
738738
739739// process and validate input provided through cmd or file
740740func processJSONInput (c * cli.Context ) * commonpb.Payloads {
741- rawJson := processJSONInputHelper (c , jsonTypeInput )
742- if len (rawJson ) == 0 {
743- return nil
744- }
741+ jsonsRaw := readJSONInputs (c , jsonTypeInput )
745742
746- var v interface {}
747- if err := json .Unmarshal (rawJson , & v ); err != nil {
748- ErrorAndExit ("Input is not a valid JSON." , err )
749- }
743+ var jsons []interface {}
744+ for _ , jsonRaw := range jsonsRaw {
745+ if jsonRaw == nil {
746+ jsons = append (jsons , nil )
747+ } else {
748+ var j interface {}
749+ if err := json .Unmarshal (jsonRaw , & j ); err != nil {
750+ ErrorAndExit ("Input is not a valid JSON." , err )
751+ }
752+ jsons = append (jsons , j )
753+ }
750754
751- p , err := payloads .Encode (v )
755+ }
756+ p , err := payloads .Encode (jsons ... )
752757 if err != nil {
753758 ErrorAndExit ("Unable to encode Input." , err )
754759 }
755760
756761 return p
757762}
758763
759- // process and validate json
760- func processJSONInputHelper (c * cli.Context , jType jsonType ) []byte {
761- var flagNameOfRawInput string
762- var flagNameOfInputFileName string
764+ // read multiple inputs presented in json format
765+ func readJSONInputs (c * cli.Context , jType jsonType ) [] []byte {
766+ var flagRawInput string
767+ var flagInputFileName string
763768
764769 switch jType {
765770 case jsonTypeInput :
766- flagNameOfRawInput = FlagInput
767- flagNameOfInputFileName = FlagInputFile
771+ flagRawInput = FlagInput
772+ flagInputFileName = FlagInputFile
768773 case jsonTypeMemo :
769- flagNameOfRawInput = FlagMemo
770- flagNameOfInputFileName = FlagMemoFile
774+ flagRawInput = FlagMemo
775+ flagInputFileName = FlagMemoFile
771776 default :
772777 return nil
773778 }
774779
775- if c .IsSet (flagNameOfRawInput ) {
776- return []byte (c .String (flagNameOfRawInput ))
777- } else if c .IsSet (flagNameOfInputFileName ) {
778- inputFile := c .String (flagNameOfInputFileName )
780+ if c .IsSet (flagRawInput ) {
781+ inputsG := c .Generic (flagRawInput )
782+
783+ var inputs * cli.StringSlice
784+ var ok bool
785+ if inputs , ok = inputsG .(* cli.StringSlice ); ! ok {
786+ // input could be provided as StringFlag instead of StringSliceFlag
787+ ss := make (cli.StringSlice , 1 )
788+ ss [0 ] = fmt .Sprintf ("%v" , inputsG )
789+ inputs = & ss
790+ }
791+
792+ var inputsRaw [][]byte
793+ for _ , i := range * inputs {
794+ if strings .EqualFold (i , "null" ) {
795+ inputsRaw = append (inputsRaw , []byte (nil ))
796+ } else {
797+ inputsRaw = append (inputsRaw , []byte (i ))
798+ }
799+ }
800+
801+ return inputsRaw
802+ } else if c .IsSet (flagInputFileName ) {
803+ inputFile := c .String (flagInputFileName )
779804 // This method is purely used to parse input from the CLI. The input comes from a trusted user
780805 // #nosec
781806 data , err := ioutil .ReadFile (inputFile )
782807 if err != nil {
783808 ErrorAndExit ("Error reading input file" , err )
784809 }
785- return data
810+ return [][] byte { data }
786811 }
787812 return nil
788813}
0 commit comments