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
}