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