Skip to content

Commit f957112

Browse files
committed
Support Option and Argument validators
1 parent 12d1c1a commit f957112

File tree

1 file changed

+22
-4
lines changed

1 file changed

+22
-4
lines changed

Commander/ArgumentDescription.swift

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,40 +26,58 @@ extension ArgumentConvertible {
2626

2727
public class Argument<T : ArgumentConvertible> : ArgumentDescriptor {
2828
public typealias ValueType = T
29+
public typealias Validator = ValueType throws -> ValueType
2930

3031
public let name:String
3132
public let description:String?
33+
public let validator:Validator?
3234

3335
public var type:ArgumentType { return .Argument }
3436

35-
public init(_ name:String, description:String? = nil) {
37+
public init(_ name:String, description:String? = nil, validator: Validator? = nil) {
3638
self.name = name
3739
self.description = description
40+
self.validator = validator
3841
}
3942

4043
public func parse(parser:ArgumentParser) throws -> ValueType {
41-
return try T(parser: parser)
44+
let value = try T(parser: parser)
45+
46+
if let validator = validator {
47+
return try validator(value)
48+
}
49+
50+
return value
4251
}
4352
}
4453

4554

4655
public class Option<T : ArgumentConvertible> : ArgumentDescriptor {
4756
public typealias ValueType = T
57+
public typealias Validator = ValueType throws -> ValueType
4858

4959
public let name:String
5060
public let description:String?
5161
public let `default`:ValueType
5262
public var type:ArgumentType { return .Option }
63+
public let validator:Validator?
5364

54-
public init(_ name:String, _ `default`:ValueType, description:String? = nil) {
65+
public init(_ name:String, _ `default`:ValueType, description:String? = nil, validator: Validator? = nil) {
5566
self.name = name
5667
self.description = description
5768
self.`default` = `default`
69+
self.validator = validator
5870
}
5971

6072
public func parse(parser:ArgumentParser) throws -> ValueType {
6173
if let value = try parser.shiftValueForOption(name) {
62-
return try T(string: value)
74+
let value = try T(string: value)
75+
76+
if let validator = validator {
77+
return try validator(value)
78+
}
79+
80+
return value
6381
}
6482

6583
return `default`

0 commit comments

Comments
 (0)