5 // Created by Hori,Masaki on 2017/01/20.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
14 func value(for keyPath: String) -> JSON {
16 return self[keyPath.components(separatedBy: ".")]
21 let index = self.count - 1
27 private extension Data {
29 var utf8String: String? { return String(data: self, encoding: .utf8) }
32 func +<Key, Value> (lhs: [Key: Value], rhs: (Key, Value)) -> [Key: Value] {
40 private func splitJSON(_ data: Data) -> String? {
42 let prefix = "svdata="
44 guard let string = data.utf8String,
45 let range = string.range(of: prefix) else {
47 print("data is wrong")
51 return String(string[range.upperBound...])
54 private func parseParameter(_ request: URLRequest) -> [String: String]? {
59 .removingPercentEncoding?
60 .components(separatedBy: "&")
61 .map { $0.components(separatedBy: "=") }
62 .filter { $0.count == 2 }
63 .map { (piar: [String]) -> (String, String) in (piar[0], piar[1]) }
64 .reduce(into: [String: String]()) { (dict: inout [String: String], value: (String, String)) in
66 dict[value.0] = value.1
70 struct ParameterValue {
72 private let rawValue: String?
74 var int: Int? { return rawValue.flatMap { Int($0) } }
75 var double: Double? { return rawValue.flatMap { Double($0) } }
76 var string: String? { return rawValue }
79 guard let _ = rawValue else { return nil }
86 if let s = self.string?.lowercased() {
89 case "true", "yes", "t", "y": return true
98 var valid: Bool { return rawValue != nil }
100 init(_ rawValue: String?) {
102 self.rawValue = rawValue
108 private let rawValue: [String: String]
110 init(_ rawValue: [String: String]) {
112 self.rawValue = rawValue
115 init?(_ request: URLRequest) {
117 guard let paramList = parseParameter(request) else { return nil }
122 subscript(_ key: String) -> ParameterValue {
124 return ParameterValue(rawValue[key])
127 func map<T>(_ transform: (String, String) throws -> T) rethrows -> [T] {
129 return try rawValue.map(transform)
136 let parameter: Parameter
141 if let r = json["api_result"].int { return r == 1 }
146 init(api: String, parameter: Parameter, json: JSON) {
149 self.parameter = parameter
154 init?(request: URLRequest, data: Data) {
158 guard let josn = splitJSON(data) else {
160 print("Can not parse JSON")
164 self.json = JSON(parseJSON: josn)
166 guard let parameter = Parameter(request) else {
168 print("Can not parse Parameter")
172 self.parameter = parameter
174 guard let api = request.url?.path else {
176 print("URLRequest is wrong")