0001 // 0002 // RequestData+Target.swift 0003 // Vapor 0004 // 0005 // Created by Logan Wright on 2/21/16. 0006 // Copyright © 2016 Tanner Nelson. All rights reserved. 0007 // 0008 0009 import Foundation 0010 0011 /** 0012 * This protocol defines a type of data received. 0013 * these variables are used to access underlying 0014 * values 0015 */ 0016 public protocol Node{ 0017 var isNull: Bool { get } 0018 var bool: Bool { get } 0019 var float: Float? { get } 0020 var double: Double? { get } 0021 var int: Int? { get } 0022 var uint: UInt? { get } 0023 var string: String? { get } 0024 var array: [Node]? { get } 0025 var object: [String : Node]? { get } 0026 } 0027 0028 public extension Request { 0029 0030 /** 0031 * The data received from the request in json body or url query 0032 */ 0033 public struct Data
RequestData+Target.swift:24 var array: [Node]? { get }RequestData+Target.swift:25 var object: [String : Node]? { get }RequestData+Target.swift:104 extension Json: Node {RequestData+Target.swift:171 return array.map { $0 as Node }RequestData+Target.swift:169 public var array: [Node]? {RequestData+Target.swift:176 var mapped: [String : Node] = [:]RequestData+Target.swift:178 mapped[key] = val as NodeRequestData+Target.swift:174 public var object: [String : Node]? {RequestData+Target.swift:184 extension String: Node {RequestData+Target.swift:219 .map { $0 as Node }RequestData+Target.swift:216 public var array: [Node]? {RequestData+Target.swift:222 public var object: [String : Node]? {{ 0034 0035 0036 // MARK: Initialization 0037 0038 public let query
Request.swift:26 public let data: DataRequest.swift:70 self.data = Data(query: query, bytes: body)RequestData+Target.swift:50 Data.parsePostData(bytes).forEach { key, val in: [String : String] 0039 public let json
RequestData+Target.swift:55 self.query = mutableQueryRequestData+Target.swift:61 return query[key] ?? json?[key]: Json? 0040 0041 internal init
RequestData+Target.swift:45 self.json = try Json.deserialize(bytes)RequestData+Target.swift:47 self.json = nilRequestData+Target.swift:61 return query[key] ?? json?[key]RequestData+Target.swift:65 return json?[idx](query: [String : String] = [:], bytes: [UInt8]) { 0042 var mutableQuery = query 0043 0044 do { 0045 self.json = try Json.deserialize(bytes) 0046 } catch { 0047 self.json = nil 0048 0049 // Will overwrite keys if they are duplicated from `query` 0050 Data.parsePostData(bytes).forEach { key, val in 0051 mutableQuery[key] = val 0052 } 0053 } 0054 0055 self.query = mutableQuery 0056 } 0057 0058 // MARK: Subscripting 0059 0060 public subscript(key: String) -> Node? { 0061 return query[key] ?? json?[key] 0062 } 0063 0064 public subscript(idx: Int) -> Node? { 0065 return json?[idx] 0066 } 0067 0068 /** 0069 Checks for form encoding of body if Json fails 0070 0071 - parameter body: byte array from body 0072 0073 - returns: a key value pair dictionary 0074 */ 0075 static func parsePostData
Request.swift:70 self.data = Data(query: query, bytes: body)(body: [UInt8]) -> [String: String] { 0076 if let bodyString = NSString(bytes: body, length: body.count, encoding: NSUTF8StringEncoding) { 0077 return self.parseData(bodyString.description) 0078 } 0079 0080 return [:] 0081 } 0082 0083 /** 0084 Parses `key=value` pair data separated by `&`. 0085 0086 - returns: String dictionary of parsed data 0087 */ 0088 static func parseData
RequestData+Target.swift:50 Data.parsePostData(bytes).forEach { key, val in(string: String) -> [String: String] { 0089 var data: [String: String] = [:] 0090 0091 for pair in string.split("&") { 0092 let tokens = pair.split(1, separator: "=") 0093 0094 if let name = tokens.first, value = tokens.last { 0095 data[name.removePercentEncoding()] = value.removePercentEncoding() 0096 } 0097 } 0098 0099 return data 0100 } 0101 } 0102 } 0103 0104 extension Json: Node { 0105 public var bool: Bool { 0106 switch self { 0107 case .BooleanValue(let bool): 0108 return bool 0109 case .NumberValue(let number): 0110 return Int(number) > 0 0111 case .StringValue(let string): 0112 return Bool(string) 0113 case .ObjectValue(_), .ArrayValue(_), .NullValue: 0114 return false 0115 } 0116 } 0117 0118 public var int: Int? { 0119 guard let double = double else { return nil } 0120 return Int(double) 0121 } 0122 0123 public var uint: UInt? { 0124 guard let double = double else { return nil } 0125 return UInt(double) 0126 } 0127 0128 public var float: Float? { 0129 guard let double = double else { return nil } 0130 return Float(double) 0131 } 0132 0133 public var double
RequestData+Target.swift:77 return self.parseData(bodyString.description): Double? { 0134 switch self { 0135 case .BooleanValue(let bool): 0136 return bool ? 1 : 0 0137 case .NumberValue(let number): 0138 return Double(number) 0139 case .StringValue(let string): 0140 return Double(string) 0141 case .NullValue: 0142 return 0 0143 case .ObjectValue(_), .ArrayValue(_): 0144 return nil 0145 } 0146 } 0147 0148 public var string
RequestData+Target.swift:119 guard let double = double else { return nil }RequestData+Target.swift:124 guard let double = double else { return nil }RequestData+Target.swift:129 guard let double = double else { return nil }: String? { 0149 switch self { 0150 case .StringValue(let string): 0151 return string 0152 case .BooleanValue(let bool): 0153 return String(bool) 0154 case .NumberValue(let number): 0155 return String(number) 0156 case .NullValue: 0157 return "null" 0158 case .ArrayValue(let array): 0159 return array 0160 .flatMap { js in 0161 return js.string 0162 } 0163 .joinWithSeparator(",") 0164 case .ObjectValue(_): 0165 return nil 0166 } 0167 } 0168 0169 public var array: [Node]? { 0170 guard case let .ArrayValue(array) = self else { return nil } 0171 return array.map { $0 as Node } 0172 } 0173 0174 public var object: [String : Node]? { 0175 guard case let .ObjectValue(object) = self else { return nil } 0176 var mapped: [String : Node] = [:] 0177 object.forEach { key, val in 0178 mapped[key] = val as Node 0179 } 0180 return mapped 0181 } 0182 } 0183 0184 extension String: Node { 0185 public var isNull: Bool { 0186 return self == "null" 0187 } 0188 0189 public var bool: Bool { 0190 return Bool(self) 0191 } 0192 0193 public var int: Int? { 0194 guard let double = double else { return nil } 0195 return Int(double) 0196 } 0197 0198 public var uint: UInt? { 0199 guard let double = double else { return nil } 0200 return UInt(double) 0201 } 0202 0203 public var float: Float? { 0204 guard let double = double else { return nil } 0205 return Float(double) 0206 } 0207 0208 public var double
RequestData+Target.swift:161 return js.string: Double? { 0209 return Double(self) 0210 } 0211 0212 public var string: String? { 0213 return self 0214 } 0215 0216 public var array: [Node]? { 0217 return self 0218 .componentsSeparatedByString(",") 0219 .map { $0 as Node } 0220 } 0221 0222 public var object: [String : Node]? { 0223 return nil 0224 } 0225 } 0226 0227 extension Bool { 0228 /** 0229 This function seeks to replicate the expected behavior of `var boolValue: Bool` on `NSString`. Any variant of `yes`, `y`, `true`, `t`, or any numerical value greater than 0 will be considered `true` 0230 */ 0231 public init
RequestData+Target.swift:194 guard let double = double else { return nil }RequestData+Target.swift:199 guard let double = double else { return nil }RequestData+Target.swift:204 guard let double = double else { return nil }(_ string: String) { 0232 let cleaned = string 0233 .lowercaseString 0234 .characters 0235 .first ?? "n" 0236 0237 switch cleaned { 0238 case "t", "y", "1": 0239 self = true 0240 default: 0241 if let int = Int(String(cleaned)) where int > 0 { 0242 self = true 0243 } else { 0244 self = false 0245 } 0246 0247 } 0248 } 0249 } 0250
RequestData+Target.swift:112 return Bool(string)RequestData+Target.swift:190 return Bool(self)