20756: Fix panic when TestExecStop calls Wait before Stop.
[arvados.git] / lib / cli / get.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 package cli
6
7 import (
8         "encoding/json"
9         "fmt"
10         "io"
11
12         "git.arvados.org/arvados.git/lib/cmd"
13         "git.arvados.org/arvados.git/sdk/go/arvados"
14         "github.com/ghodss/yaml"
15 )
16
17 var Get cmd.Handler = getCmd{}
18
19 type getCmd struct{}
20
21 func (getCmd) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
22         var err error
23         defer func() {
24                 if err != nil {
25                         fmt.Fprintf(stderr, "%s\n", err)
26                 }
27         }()
28
29         flags, opts := LegacyFlagSet()
30         flags.SetOutput(stderr)
31         err = flags.Parse(args)
32         if err != nil {
33                 return cmd.EXIT_INVALIDARGUMENT
34         }
35         if len(flags.Args()) != 1 {
36                 fmt.Fprintf(stderr, "usage of %s:\n", prog)
37                 flags.PrintDefaults()
38                 return cmd.EXIT_INVALIDARGUMENT
39         }
40         if opts.Short {
41                 opts.Format = "uuid"
42         }
43
44         id := flags.Args()[0]
45         client := arvados.NewClientFromEnv()
46         path, err := client.PathForUUID("get", id)
47         if err != nil {
48                 return 1
49         }
50
51         var obj map[string]interface{}
52         err = client.RequestAndDecode(&obj, "GET", path, nil, nil)
53         if err != nil {
54                 err = fmt.Errorf("GET %s: %s", path, err)
55                 return 1
56         }
57         if opts.Format == "yaml" {
58                 var buf []byte
59                 buf, err = yaml.Marshal(obj)
60                 if err == nil {
61                         _, err = stdout.Write(buf)
62                 }
63         } else if opts.Format == "uuid" {
64                 fmt.Fprintln(stdout, obj["uuid"])
65         } else {
66                 enc := json.NewEncoder(stdout)
67                 enc.SetIndent("", "  ")
68                 err = enc.Encode(obj)
69         }
70         if err != nil {
71                 err = fmt.Errorf("encoding: %s", err)
72                 return 1
73         }
74         return 0
75 }