1
1
package main
2
2
3
3
import (
4
+ "fmt"
4
5
"runtime"
5
6
"strconv"
7
+ "strings"
6
8
"time"
7
9
8
10
"github.com/alecthomas/kingpin"
@@ -32,6 +34,8 @@ type kingpinParser struct {
32
34
keyPath string
33
35
rate * nullableUint64
34
36
clientType clientTyp
37
+
38
+ printSpec * nullableString
35
39
}
36
40
37
41
func newKingpinParser () argsParser {
@@ -52,6 +56,7 @@ func newKingpinParser() argsParser {
52
56
url : "" ,
53
57
rate : new (nullableUint64 ),
54
58
clientType : fhttp ,
59
+ printSpec : new (nullableString ),
55
60
}
56
61
57
62
app := kingpin .New ("" , "Fast cross-platform HTTP benchmarking tool" ).
@@ -133,6 +138,18 @@ func newKingpinParser() argsParser {
133
138
}).
134
139
Bool ()
135
140
141
+ app .Flag (
142
+ "print" , "Specifies what to output. Comma-separated list of values" +
143
+ " 'intro' (short: 'i'), 'progress' (short: 'p')," +
144
+ " 'result' (short: 'r'). Examples:" +
145
+ "\n \t * i,p,r (prints everything)" +
146
+ "\n \t * intro,result (intro & result)" +
147
+ "\n \t * r (result only)" +
148
+ "\n \t * result (same as above)" ).
149
+ PlaceHolder ("<spec>" ).
150
+ Short ('p' ).
151
+ SetValue (kparser .printSpec )
152
+
136
153
app .Arg ("url" , "Target's URL" ).Required ().
137
154
StringVar (& kparser .url )
138
155
@@ -146,6 +163,13 @@ func (k *kingpinParser) parse(args []string) (config, error) {
146
163
if err != nil {
147
164
return emptyConf , err
148
165
}
166
+ pi , pp , pr := true , true , true
167
+ if k .printSpec .val != nil {
168
+ pi , pp , pr , err = parsePrintSpec (* k .printSpec .val )
169
+ if err != nil {
170
+ return emptyConf , err
171
+ }
172
+ }
149
173
return config {
150
174
numConns : k .numConns ,
151
175
numReqs : k .numReqs .val ,
@@ -163,5 +187,38 @@ func (k *kingpinParser) parse(args []string) (config, error) {
163
187
insecure : k .insecure ,
164
188
rate : k .rate .val ,
165
189
clientType : k .clientType ,
190
+ printIntro : pi ,
191
+ printProgress : pp ,
192
+ printResult : pr ,
166
193
}, nil
167
194
}
195
+
196
+ func parsePrintSpec (spec string ) (bool , bool , bool , error ) {
197
+ pi , pp , pr := false , false , false
198
+ if spec == "" {
199
+ return false , false , false , errEmptyPrintSpec
200
+ }
201
+ parts := strings .Split (spec , "," )
202
+ partsCount := 0
203
+ for _ , p := range parts {
204
+ switch p {
205
+ case "i" , "intro" :
206
+ pi = true
207
+ case "p" , "progress" :
208
+ pp = true
209
+ case "r" , "result" :
210
+ pr = true
211
+ default :
212
+ return false , false , false ,
213
+ fmt .Errorf ("%q is not a valid part of print spec" , p )
214
+ }
215
+ partsCount ++
216
+ }
217
+ if partsCount < 1 || partsCount > 3 {
218
+ return false , false , false ,
219
+ fmt .Errorf (
220
+ "Spec %q has too many parts, at most 3 are allowed" , spec ,
221
+ )
222
+ }
223
+ return pi , pp , pr , nil
224
+ }
0 commit comments