@@ -12,31 +12,43 @@ import (
12
12
"github.com/coder/coder/cli/cliui"
13
13
)
14
14
15
- func (r * RootCmd ) stat () * clibase.Cmd {
16
- fs := afero .NewReadOnlyFs (afero .NewOsFs ())
17
- defaultCols := []string {
18
- "host_cpu" ,
19
- "host_memory" ,
20
- "home_disk" ,
21
- "container_cpu" ,
22
- "container_memory" ,
23
- }
24
- formatter := cliui .NewOutputFormatter (
25
- cliui .TableFormat ([]statsRow {}, defaultCols ),
26
- cliui .JSONFormat (),
27
- )
28
- st , err := clistat .New (clistat .WithFS (fs ))
29
- if err != nil {
30
- panic (xerrors .Errorf ("initialize workspace stats collector: %w" , err ))
15
+ func initStatterMW (tgt * * clistat.Statter , fs afero.Fs ) clibase.MiddlewareFunc {
16
+ return func (next clibase.HandlerFunc ) clibase.HandlerFunc {
17
+ return func (i * clibase.Invocation ) error {
18
+ var err error
19
+ stat , err := clistat .New (clistat .WithFS (fs ))
20
+ if err != nil {
21
+ return xerrors .Errorf ("initialize workspace stats collector: %w" , err )
22
+ }
23
+ * tgt = stat
24
+ return next (i )
25
+ }
31
26
}
27
+ }
32
28
29
+ func (r * RootCmd ) stat () * clibase.Cmd {
30
+ var (
31
+ st * clistat.Statter
32
+ fs = afero .NewReadOnlyFs (afero .NewOsFs ())
33
+ formatter = cliui .NewOutputFormatter (
34
+ cliui .TableFormat ([]statsRow {}, []string {
35
+ "host_cpu" ,
36
+ "host_memory" ,
37
+ "home_disk" ,
38
+ "container_cpu" ,
39
+ "container_memory" ,
40
+ }),
41
+ cliui .JSONFormat (),
42
+ )
43
+ )
33
44
cmd := & clibase.Cmd {
34
- Use : "stat" ,
35
- Short : "Show resource usage for the current workspace." ,
45
+ Use : "stat" ,
46
+ Short : "Show resource usage for the current workspace." ,
47
+ Middleware : initStatterMW (& st , fs ),
36
48
Children : []* clibase.Cmd {
37
- r .statCPU (st , fs ),
38
- r .statMem (st , fs ),
39
- r .statDisk (st ),
49
+ r .statCPU (fs ),
50
+ r .statMem (fs ),
51
+ r .statDisk (fs ),
40
52
},
41
53
Handler : func (inv * clibase.Invocation ) error {
42
54
var sr statsRow
@@ -118,12 +130,16 @@ func (r *RootCmd) stat() *clibase.Cmd {
118
130
return cmd
119
131
}
120
132
121
- func (* RootCmd ) statCPU (s * clistat.Statter , fs afero.Fs ) * clibase.Cmd {
122
- var hostArg bool
123
- formatter := cliui .NewOutputFormatter (cliui .TextFormat (), cliui .JSONFormat ())
133
+ func (* RootCmd ) statCPU (fs afero.Fs ) * clibase.Cmd {
134
+ var (
135
+ hostArg bool
136
+ st * clistat.Statter
137
+ formatter = cliui .NewOutputFormatter (cliui .TextFormat (), cliui .JSONFormat ())
138
+ )
124
139
cmd := & clibase.Cmd {
125
- Use : "cpu" ,
126
- Short : "Show CPU usage, in cores." ,
140
+ Use : "cpu" ,
141
+ Short : "Show CPU usage, in cores." ,
142
+ Middleware : initStatterMW (& st , fs ),
127
143
Options : clibase.OptionSet {
128
144
{
129
145
Flag : "host" ,
@@ -135,9 +151,9 @@ func (*RootCmd) statCPU(s *clistat.Statter, fs afero.Fs) *clibase.Cmd {
135
151
var cs * clistat.Result
136
152
var err error
137
153
if ok , _ := clistat .IsContainerized (fs ); ok && ! hostArg {
138
- cs , err = s .ContainerCPU ()
154
+ cs , err = st .ContainerCPU ()
139
155
} else {
140
- cs , err = s .HostCPU ()
156
+ cs , err = st .HostCPU ()
141
157
}
142
158
if err != nil {
143
159
return err
@@ -155,13 +171,17 @@ func (*RootCmd) statCPU(s *clistat.Statter, fs afero.Fs) *clibase.Cmd {
155
171
return cmd
156
172
}
157
173
158
- func (* RootCmd ) statMem (s * clistat.Statter , fs afero.Fs ) * clibase.Cmd {
159
- var hostArg bool
160
- var prefixArg string
161
- formatter := cliui .NewOutputFormatter (cliui .TextFormat (), cliui .JSONFormat ())
174
+ func (* RootCmd ) statMem (fs afero.Fs ) * clibase.Cmd {
175
+ var (
176
+ hostArg bool
177
+ prefixArg string
178
+ st * clistat.Statter
179
+ formatter = cliui .NewOutputFormatter (cliui .TextFormat (), cliui .JSONFormat ())
180
+ )
162
181
cmd := & clibase.Cmd {
163
- Use : "mem" ,
164
- Short : "Show memory usage, in gigabytes." ,
182
+ Use : "mem" ,
183
+ Short : "Show memory usage, in gigabytes." ,
184
+ Middleware : initStatterMW (& st , fs ),
165
185
Options : clibase.OptionSet {
166
186
{
167
187
Flag : "host" ,
@@ -185,9 +205,9 @@ func (*RootCmd) statMem(s *clistat.Statter, fs afero.Fs) *clibase.Cmd {
185
205
var ms * clistat.Result
186
206
var err error
187
207
if ok , _ := clistat .IsContainerized (fs ); ok && ! hostArg {
188
- ms , err = s .ContainerMemory (pfx )
208
+ ms , err = st .ContainerMemory (pfx )
189
209
} else {
190
- ms , err = s .HostMemory (pfx )
210
+ ms , err = st .HostMemory (pfx )
191
211
}
192
212
if err != nil {
193
213
return err
@@ -205,13 +225,17 @@ func (*RootCmd) statMem(s *clistat.Statter, fs afero.Fs) *clibase.Cmd {
205
225
return cmd
206
226
}
207
227
208
- func (* RootCmd ) statDisk (s * clistat.Statter ) * clibase.Cmd {
209
- var pathArg string
210
- var prefixArg string
211
- formatter := cliui .NewOutputFormatter (cliui .TextFormat (), cliui .JSONFormat ())
228
+ func (* RootCmd ) statDisk (fs afero.Fs ) * clibase.Cmd {
229
+ var (
230
+ pathArg string
231
+ prefixArg string
232
+ st * clistat.Statter
233
+ formatter = cliui .NewOutputFormatter (cliui .TextFormat (), cliui .JSONFormat ())
234
+ )
212
235
cmd := & clibase.Cmd {
213
- Use : "disk" ,
214
- Short : "Show disk usage, in gigabytes." ,
236
+ Use : "disk" ,
237
+ Short : "Show disk usage, in gigabytes." ,
238
+ Middleware : initStatterMW (& st , fs ),
215
239
Options : clibase.OptionSet {
216
240
{
217
241
Flag : "path" ,
@@ -237,7 +261,7 @@ func (*RootCmd) statDisk(s *clistat.Statter) *clibase.Cmd {
237
261
if len (inv .Args ) > 0 {
238
262
pathArg = inv .Args [0 ]
239
263
}
240
- ds , err := s .Disk (pfx , pathArg )
264
+ ds , err := st .Disk (pfx , pathArg )
241
265
if err != nil {
242
266
if os .IsNotExist (err ) {
243
267
//nolint:gocritic // fmt.Errorf produces a more concise error.
0 commit comments