func run()

in cmds/clients/contestcli/cli/verbs.go [29:147]


func run(requestor string, transport transport.Transport, stdout io.Writer) error {
	verb := strings.ToLower(flagSet.Arg(0))
	if verb == "" {
		return fmt.Errorf("Missing verb, see --help")
	}
	var resp interface{}
	var err error
	switch verb {
	case "start":
		var jobDesc []byte
		if flagSet.Arg(1) == "" {
			fmt.Fprintf(os.Stderr, "Reading from stdin...\n")
			jd, err := ioutil.ReadAll(os.Stdin)
			if err != nil {
				return fmt.Errorf("failed to read job descriptor: %w", err)
			}
			jobDesc = jd
		} else {
			jd, err := ioutil.ReadFile(flagSet.Arg(1))
			if err != nil {
				return fmt.Errorf("failed to read job descriptor: %w", err)
			}
			jobDesc = jd
		}

		jobDescFormat := config.JobDescFormatJSON
		if *flagYAML {
			jobDescFormat = config.JobDescFormatYAML
		}
		jobDescJSON, err := config.ParseJobDescriptor(jobDesc, jobDescFormat)
		if err != nil {
			return fmt.Errorf("failed to parse job descriptor: %w", err)
		}

		startResp, err := transport.Start(context.Background(), requestor, string(jobDescJSON))
		if err != nil {
			return err
		}
		resp = startResp

		// handle wait
		if *flagWait && startResp.Data.JobID != 0 {
			// print immediately if wait is used
			buffer := &bytes.Buffer{}
			encoder := json.NewEncoder(buffer)
			encoder.SetEscapeHTML(false)
			encoder.SetIndent("", " ")
			err = encoder.Encode(startResp)
			if err != nil {
				return fmt.Errorf("cannot re-encode api.Respose object: %v", err)
			}
			indentedJSON := buffer.String()
			fmt.Fprintf(stdout, "%s", string(indentedJSON))

			fmt.Fprintf(os.Stderr, "\nWaiting for job to complete...\n")
			resp, err = wait(context.Background(), startResp.Data.JobID, jobWaitPoll, requestor, transport)
			if err != nil {
				return err
			}
		}
	case "stop":
		jobID, err := parseJob(flagSet.Arg(1))
		if err != nil {
			return err
		}
		resp, err = transport.Stop(context.Background(), requestor, types.JobID(jobID))
		if err != nil {
			return err
		}
	case "status":
		jobID, err := parseJob(flagSet.Arg(1))
		if err != nil {
			return err
		}
		resp, err = transport.Status(context.Background(), requestor, jobID)
		if err != nil {
			return err
		}
	case "retry":
		jobID, err := parseJob(flagSet.Arg(1))
		if err != nil {
			return err
		}
		resp, err = transport.Retry(context.Background(), requestor, jobID)
		if err != nil {
			return err
		}
	case "list":
		var states []job.State
		for _, sts := range *flagStates {
			st, err := job.EventNameToJobState(event.Name(sts))
			if err != nil {
				return err
			}
			states = append(states, st)
		}
		resp, err = transport.List(context.Background(), requestor, states, *flagTags)
		if err != nil {
			return err
		}
	case "version":
		resp, err = transport.Version(context.Background(), requestor)
		if err != nil {
			return err
		}
	default:
		return fmt.Errorf("invalid verb: '%s'", verb)
	}
	buffer := &bytes.Buffer{}
	encoder := json.NewEncoder(buffer)
	encoder.SetEscapeHTML(false)
	encoder.SetIndent("", " ")
	err = encoder.Encode(resp)
	if err != nil {
		return fmt.Errorf("cannot re-encode api.Respose object: %v", err)
	}
	stdout.Write(buffer.Bytes())
	return nil
}