@@ -71,50 +71,12 @@ struct TestConfig {
71
71
var action : TestAction ?
72
72
var tests : [ String ] ?
73
73
}
74
- var c = PartialTestConfig ( )
75
74
76
- let validOptions = [
75
+ let p = try ArgumentParser ( into : PartialTestConfig ( ) , validOptions : [
77
76
" --iter-scale " , " --num-samples " , " --num-iters " ,
78
77
" --verbose " , " --delim " , " --list " , " --sleep " ,
79
78
" --tags " , " --skip-tags " , " --help "
80
- ]
81
- guard let benchArgs = parseArgs ( validOptions) else {
82
- throw ArgumentError . general ( " Failed to parse arguments " )
83
- }
84
-
85
- func checked< T> (
86
- _ parse: ( String ) throws -> T ? ,
87
- _ value: String ,
88
- argument: String ? = nil
89
- ) throws -> T {
90
- if let t = try parse ( value) { return t }
91
- var type = " \( T . self) "
92
- if type. starts ( with: " Optional< " ) {
93
- let s = type. index ( after: type. index ( of: " < " ) !)
94
- let e = type. index ( before: type. endIndex) // ">"
95
- type = String ( type [ s..< e] ) // strip Optional< >
96
- }
97
- throw ArgumentError . invalidType (
98
- value: value, type: type, argument: argument)
99
- }
100
-
101
- func parseArg< T> (
102
- _ name: String ? ,
103
- _ property: WritableKeyPath < PartialTestConfig , T > ,
104
- defaultValue: T ? = nil ,
105
- parser parse: ( String ) throws -> T ? = { _ in nil }
106
- ) throws {
107
- if let name = name, let value = benchArgs. optionalArgsMap [ name] {
108
- guard !value. isEmpty || defaultValue != nil
109
- else { throw ArgumentError . missingValue ( name) }
110
-
111
- c [ keyPath: property] = ( value. isEmpty)
112
- ? defaultValue!
113
- : try checked ( parse, value, argument: name)
114
- } else if name == nil {
115
- c [ keyPath: property] = benchArgs. positionalArgs as! T
116
- }
117
- }
79
+ ] )
118
80
119
81
func tags( tags: String ) throws -> Set < BenchmarkCategory > {
120
82
// We support specifying multiple tags by splitting on comma, i.e.:
@@ -126,18 +88,20 @@ struct TestConfig {
126
88
}
127
89
128
90
// Parse command line arguments
129
- try parseArg ( " --iter-scale " , \. iterationScale) { Int ( $0) }
130
- try parseArg ( " --num-iters " , \. fixedNumIters) { UInt ( $0) }
131
- try parseArg ( " --num-samples " , \. numSamples) { Int ( $0) }
132
- try parseArg ( " --verbose " , \. verbose, defaultValue: true )
133
- try parseArg ( " --delim " , \. delim) { $0 }
134
- try parseArg ( " --tags " , \PartialTestConfig . tags, parser: tags)
135
- try parseArg ( " --skip-tags " , \PartialTestConfig . skipTags,
91
+ try p . parseArg ( " --iter-scale " , \. iterationScale) { Int ( $0) }
92
+ try p . parseArg ( " --num-iters " , \. fixedNumIters) { UInt ( $0) }
93
+ try p . parseArg ( " --num-samples " , \. numSamples) { Int ( $0) }
94
+ try p . parseArg ( " --verbose " , \. verbose, defaultValue: true )
95
+ try p . parseArg ( " --delim " , \. delim) { $0 }
96
+ try p . parseArg ( " --tags " , \PartialTestConfig . tags, parser: tags)
97
+ try p . parseArg ( " --skip-tags " , \PartialTestConfig . skipTags,
136
98
defaultValue: [ ] , parser: tags)
137
- try parseArg ( " --sleep " , \. afterRunSleep) { Int ( $0) }
138
- try parseArg ( " --list " , \. action, defaultValue: . listTests)
139
- try parseArg ( " --help " , \. action, defaultValue: . help( validOptions) )
140
- try parseArg ( nil , \. tests) // positional arguments
99
+ try p. parseArg ( " --sleep " , \. afterRunSleep) { Int ( $0) }
100
+ try p. parseArg ( " --list " , \. action, defaultValue: . listTests)
101
+ try p. parseArg ( " --help " , \. action, defaultValue: . help( p. validOptions) )
102
+ try p. parseArg ( nil , \. tests) // positional arguments
103
+
104
+ let c = p. result
141
105
142
106
// Configure from the command line arguments, filling in the defaults.
143
107
delim = c. delim ?? " , "
0 commit comments