Skip to content

Commit 1d6ae49

Browse files
committed
Support using flags with options
1 parent f957112 commit 1d6ae49

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

Commander/ArgumentDescription.swift

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,15 @@ public class Option<T : ArgumentConvertible> : ArgumentDescriptor {
5757
public typealias Validator = ValueType throws -> ValueType
5858

5959
public let name:String
60+
public let flag:Character?
6061
public let description:String?
6162
public let `default`:ValueType
6263
public var type:ArgumentType { return .Option }
6364
public let validator:Validator?
6465

65-
public init(_ name:String, _ `default`:ValueType, description:String? = nil, validator: Validator? = nil) {
66+
public init(_ name:String, _ `default`:ValueType, flag:Character? = nil, description:String? = nil, validator: Validator? = nil) {
6667
self.name = name
68+
self.flag = flag
6769
self.description = description
6870
self.`default` = `default`
6971
self.validator = validator
@@ -80,6 +82,18 @@ public class Option<T : ArgumentConvertible> : ArgumentDescriptor {
8082
return value
8183
}
8284

85+
if let flag = flag {
86+
if let value = try parser.shiftValueForFlag(flag) {
87+
let value = try T(string: value)
88+
89+
if let validator = validator {
90+
return try validator(value)
91+
}
92+
93+
return value
94+
}
95+
}
96+
8397
return `default`
8498
}
8599
}

Commander/ArgumentParser.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,4 +164,52 @@ public final class ArgumentParser : ArgumentConvertible, CustomStringConvertible
164164

165165
return false
166166
}
167+
168+
/// Returns the value for a flag (-n Kyle)
169+
public func shiftValueForFlag(flag:Character) throws -> String? {
170+
return try shiftValuesForFlag(flag)?.first
171+
}
172+
173+
/// Returns the value for a flag (-n Kyle)
174+
public func shiftValuesForFlag(flag:Character, count:Int = 1) throws -> [String]? {
175+
var index = 0
176+
var hasFlag = false
177+
178+
for argument in arguments {
179+
switch argument {
180+
case .Flag(let flags):
181+
if flags.contains(flag) {
182+
hasFlag = true
183+
break
184+
}
185+
fallthrough
186+
default:
187+
++index
188+
}
189+
190+
if hasFlag {
191+
break
192+
}
193+
}
194+
195+
if hasFlag {
196+
++index // Jump flags
197+
198+
return try (0..<count).map { i in
199+
if arguments.count > index {
200+
let argument = arguments.removeAtIndex(index)
201+
switch argument {
202+
case .Argument(let value):
203+
return value
204+
default:
205+
throw ArgumentParserError(description: "Unexpected \(argument.type) `\(argument)` as a value for `-\(flag)`")
206+
}
207+
}
208+
209+
throw ArgumentParserError(description: "Missing value for `-\(flag)`")
210+
}
211+
}
212+
213+
return nil
214+
}
167215
}

0 commit comments

Comments
 (0)