8
8
"regexp"
9
9
"strconv"
10
10
"strings"
11
- "text/tabwriter"
12
11
12
+ "cdr.dev/coder-cli/internal/x/xtabwriter"
13
13
"github.com/urfave/cli"
14
14
"golang.org/x/xerrors"
15
15
@@ -19,20 +19,22 @@ import (
19
19
func makeURLCmd () cli.Command {
20
20
var outputFmt string
21
21
return cli.Command {
22
- Name : "urls" ,
23
- Usage : "Interact with environment DevURLs" ,
24
- ArgsUsage : "" ,
25
- Before : nil ,
26
- After : nil ,
27
- OnUsageError : nil ,
22
+ Name : "urls" ,
23
+ Usage : "Interact with environment DevURLs" ,
24
+ Action : exitHelp ,
28
25
Subcommands : []cli.Command {
29
26
makeCreateDevURL (),
30
27
{
31
28
Name : "ls" ,
32
29
Usage : "List all DevURLs for an environment" ,
33
30
ArgsUsage : "[env_name]" ,
34
- Before : nil ,
35
- Action : makeListDevURLs (& outputFmt ),
31
+ Before : func (c * cli.Context ) error {
32
+ if ! (outputFmt == "json" || outputFmt == "human" ) {
33
+ return xerrors .Errorf ("unknown --output value %q" )
34
+ }
35
+ return nil
36
+ },
37
+ Action : makeListDevURLs (& outputFmt ),
36
38
Flags : []cli.Flag {
37
39
cli.StringFlag {
38
40
Name : "output" ,
@@ -45,22 +47,30 @@ func makeURLCmd() cli.Command {
45
47
{
46
48
Name : "rm" ,
47
49
Usage : "Remove a dev url" ,
48
- ArgsUsage : "" ,
49
- Before : nil ,
50
- Action : removeDevURL ,
51
- Flags : nil ,
50
+ ArgsUsage : "[env_name] [port]" ,
51
+ Before : func (c * cli.Context ) error {
52
+ var (
53
+ envName = c .Args ().First ()
54
+ port = c .Args ().Get (1 )
55
+ )
56
+ if envName == "" || port == "" {
57
+ return xerrors .Errorf ("[env_name] and [port] are required arguments" )
58
+ }
59
+ return nil
60
+ },
61
+ Action : removeDevURL ,
52
62
},
53
63
},
54
64
}
55
65
}
56
66
57
67
// DevURL is the parsed json response record for a devURL from cemanager
58
68
type DevURL struct {
59
- ID string `json:"id"`
69
+ ID string `json:"id" tab:"-" `
60
70
URL string `json:"url"`
61
71
Port int `json:"port"`
72
+ Name string `json:"name" tab:"-"`
62
73
Access string `json:"access"`
63
- Name string `json:"name"`
64
74
}
65
75
66
76
var urlAccessLevel = map [string ]string {
@@ -101,18 +111,12 @@ func makeListDevURLs(outputFmt *string) func(c *cli.Context) {
101
111
envName := c .Args ().First ()
102
112
devURLs := urlList (envName )
103
113
104
- if len (devURLs ) == 0 {
105
- return
106
- }
107
-
108
114
switch * outputFmt {
109
115
case "human" :
110
- w := tabwriter .NewWriter (os .Stdout , 0 , 0 , 1 , ' ' , tabwriter .TabIndent )
111
- for _ , devURL := range devURLs {
112
- fmt .Fprintf (w , "%s\t %d\t %s\n " , devURL .URL , devURL .Port , devURL .Access )
113
- }
114
- err := w .Flush ()
115
- requireSuccess (err , "failed to flush writer: %v" , err )
116
+ err := xtabwriter .WriteTable (len (devURLs ), func (i int ) interface {} {
117
+ return devURLs [i ]
118
+ })
119
+ requireSuccess (err , "failed to write table: %v" , err )
116
120
case "json" :
117
121
err := json .NewEncoder (os .Stdout ).Encode (devURLs )
118
122
requireSuccess (err , "failed to encode devurls to json: %v" , err )
0 commit comments