12876: arvados-client get [-format=yaml] uuid
[arvados.git] / lib / cmd / cmd.go
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: Apache-2.0
4
5 // package cmd defines a RunFunc type, representing a process that can
6 // be invoked from a command line.
7 package cmd
8
9 import (
10         "fmt"
11         "io"
12 )
13
14 // A RunFunc runs a command with the given args, and returns an exit
15 // code.
16 type RunFunc func(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int
17
18 // Multi returns a command that looks up its first argument in m, and
19 // runs the resulting RunFunc with the remaining args.
20 //
21 // Example:
22 //
23 //     os.Exit(Multi(map[string]RunFunc{
24 //             "foobar": func(prog string, args []string) int {
25 //                     fmt.Println(args[0])
26 //                     return 2
27 //             },
28 //     })("/usr/bin/multi", []string{"foobar", "baz"}))
29 //
30 // ...prints "baz" and exits 2.
31 func Multi(m map[string]RunFunc) RunFunc {
32         return func(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
33                 if len(args) < 1 {
34                         fmt.Fprintf(stderr, "usage: %s command [args]", prog)
35                         return 2
36                 }
37                 if cmd, ok := m[args[0]]; !ok {
38                         fmt.Fprintf(stderr, "unrecognized command %q", args[0])
39                         return 2
40                 } else {
41                         return cmd(prog+" "+args[0], args[1:], stdin, stdout, stderr)
42                 }
43         }
44 }