12876: Fix up error/usage messages.
[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         "flag"
10         "fmt"
11         "io"
12
13         "git.curoverse.com/arvados.git/sdk/go/arvados"
14         "github.com/ghodss/yaml"
15 )
16
17 func Get(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
18         var err error
19         defer func() {
20                 if err != nil {
21                         fmt.Fprintf(stderr, "%s\n", err)
22                 }
23         }()
24
25         flags := flag.NewFlagSet(prog, flag.ContinueOnError)
26         flags.SetOutput(stderr)
27
28         format := flags.String("format", "json", "output format (json, yaml, or uuid)")
29         flags.StringVar(format, "f", "json", "output format (json, yaml, or uuid)")
30         short := flags.Bool("short", false, "equivalent to --format=uuid")
31         flags.BoolVar(short, "s", false, "equivalent to --format=uuid")
32         flags.Bool("dry-run", false, "dry run (ignored, for compatibility)")
33         flags.Bool("n", false, "dry run (ignored, for compatibility)")
34         flags.Bool("verbose", false, "verbose (ignored, for compatibility)")
35         flags.Bool("v", false, "verbose (ignored, for compatibility)")
36         err = flags.Parse(args)
37         if err != nil {
38                 return 2
39         }
40         if len(flags.Args()) != 1 {
41                 flags.Usage()
42                 return 2
43         }
44         if *short {
45                 *format = "uuid"
46         }
47
48         id := flags.Args()[0]
49         client := arvados.NewClientFromEnv()
50         path, err := client.PathForUUID("show", id)
51         if err != nil {
52                 return 1
53         }
54
55         var obj map[string]interface{}
56         err = client.RequestAndDecode(&obj, "GET", path, nil, nil)
57         if err != nil {
58                 err = fmt.Errorf("GET %s: %s", path, err)
59                 return 1
60         }
61         if *format == "yaml" {
62                 var buf []byte
63                 buf, err = yaml.Marshal(obj)
64                 if err == nil {
65                         _, err = stdout.Write(buf)
66                 }
67         } else if *format == "uuid" {
68                 fmt.Fprintln(stdout, obj["uuid"])
69         } else {
70                 enc := json.NewEncoder(stdout)
71                 enc.SetIndent("", "  ")
72                 err = enc.Encode(obj)
73         }
74         if err != nil {
75                 err = fmt.Errorf("encoding: %s", err)
76                 return 1
77         }
78         return 0
79 }