0001 // 0002 // Argument.swift 0003 // Commandant 0004 // 0005 // Created by Syo Ikeda on 12/14/15. 0006 // Copyright (c) 2015 Carthage. All rights reserved. 0007 // 0008 0009 import Result 0010 0011 /// Describes an argument that can be provided on the command line. 0012 public struct Argument<T
Argument.swift:38 public func <| <T: ArgumentType, ClientError>(mode: CommandMode, argument: Argument<T>) -> Result<T, CommandantError<ClientError>> {Argument.swift:64 public func <| <T: ArgumentType, ClientError>(mode: CommandMode, argument: Argument<[T]>) -> Result<[T], CommandantError<ClientError>> {Errors.swift:78 internal func informativeUsageError<T, ClientError>(valueExample: String, argument: Argument<T>) -> CommandantError<ClientError> {Errors.swift:87 internal func informativeUsageError<T: ArgumentType, ClientError>(argument: Argument<T>) -> CommandantError<ClientError> {Errors.swift:105 internal func informativeUsageError<T: ArgumentType, ClientError>(argument: Argument<[T]>) -> CommandantError<ClientError> {> { 0013 /// The default value for this argument. This is the value that will be used 0014 /// if the argument is never explicitly specified on the command line. 0015 /// 0016 /// If this is nil, this argument is always required. 0017 public let defaultValue
Argument.swift:17 public let defaultValue: T?Argument.swift:23 public init(defaultValue: T? = nil, usage: String) {: T? 0018 0019 /// A human-readable string describing the purpose of this argument. This will 0020 /// be shown in help messages. 0021 public let usage
Argument.swift:24 self.defaultValue = defaultValueErrors.swift:79 if argument.defaultValue != nil {Errors.swift:91 if let defaultValue = argument.defaultValue {Errors.swift:109 if let defaultValue = argument.defaultValue {: String 0022 0023 public init(defaultValue: T? = nil, usage: String) { 0024 self.defaultValue = defaultValue 0025 self.usage = usage 0026 } 0027 0028 private func invalidUsageError<ClientError>(value: String) -> CommandantError<ClientError> { 0029 let description = "Invalid value for '\(self)': \(value)" 0030 return .UsageError(description: description) 0031 } 0032 } 0033 0034 /// Evaluates the given argument in the given mode. 0035 /// 0036 /// If parsing command line arguments, and no value was specified on the command 0037 /// line, the argument's `defaultValue` is used. 0038 public func <| <T: ArgumentType, ClientError>(mode: CommandMode, argument: Argument<T>) -> Result<T, CommandantError<ClientError>> { 0039 switch mode { 0040 case let .Arguments(arguments): 0041 guard let stringValue = arguments.consumePositionalArgument() else { 0042 if let defaultValue = argument.defaultValue { 0043 return .Success(defaultValue) 0044 } else { 0045 return .Failure(missingArgumentError(argument.usage)) 0046 } 0047 } 0048 0049 if let value = T.fromString(stringValue) { 0050 return .Success(value) 0051 } else { 0052 return .Failure(argument.invalidUsageError(stringValue)) 0053 } 0054 0055 case .Usage: 0056 return .Failure(informativeUsageError(argument)) 0057 } 0058 } 0059 0060 /// Evaluates the given argument list in the given mode. 0061 /// 0062 /// If parsing command line arguments, and no value was specified on the command 0063 /// line, the argument's `defaultValue` is used. 0064 public func <| <T: ArgumentType, ClientError>(mode: CommandMode, argument: Argument<[T]>) -> Result<[T], CommandantError<ClientError>> { 0065 switch mode { 0066 case let .Arguments(arguments): 0067 guard let firstValue = arguments.consumePositionalArgument() else { 0068 if let defaultValue = argument.defaultValue { 0069 return .Success(defaultValue) 0070 } else { 0071 return .Failure(missingArgumentError(argument.usage)) 0072 } 0073 } 0074 0075 var values = [T]() 0076 0077 guard let value = T.fromString(firstValue) else { 0078 return .Failure(argument.invalidUsageError(firstValue)) 0079 } 0080 0081 values.append(value) 0082 0083 while let nextValue = arguments.consumePositionalArgument() { 0084 guard let value = T.fromString(nextValue) else { 0085 return .Failure(argument.invalidUsageError(nextValue)) 0086 } 0087 0088 values.append(value) 0089 } 0090 0091 return .Success(values) 0092 0093 case .Usage: 0094 return .Failure(informativeUsageError(argument)) 0095 } 0096 } 0097
Argument.swift:25 self.usage = usageErrors.swift:80 return informativeUsageError("[\(valueExample)]", usage: argument.usage)Errors.swift:82 return informativeUsageError(valueExample, usage: argument.usage)