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 return Logger.shared.log("data is wrong", value: nil)
50 return String(string[range.upperBound...])
53 private func parseParameter(_ request: URLRequest) -> [String: String]? {
58 .removingPercentEncoding?
59 .components(separatedBy: "&")
60 .map { $0.components(separatedBy: "=") }
61 .filter { $0.count == 2 }
62 .map { (piar: [String]) -> (String, String) in (piar[0], piar[1]) }
63 .reduce(into: [String: String]()) { (dict: inout [String: String], value: (String, String)) in
65 dict[value.0] = value.1
69 struct ParameterValue {
71 private let rawValue: String?
73 var int: Int? { return rawValue.flatMap { Int($0) } }
74 var double: Double? { return rawValue.flatMap { Double($0) } }
75 var string: String? { return rawValue }
78 guard let _ = rawValue else { return nil }
85 if let s = self.string?.lowercased() {
88 case "true", "yes", "t", "y": return true
97 var valid: Bool { return rawValue != nil }
99 init(_ rawValue: String?) {
101 self.rawValue = rawValue
107 private let rawValue: [String: String]
109 init(_ rawValue: [String: String]) {
111 self.rawValue = rawValue
114 init?(_ request: URLRequest) {
116 guard let paramList = parseParameter(request) else { return nil }
121 subscript(_ key: String) -> ParameterValue {
123 return ParameterValue(rawValue[key])
126 func map<T>(_ transform: (String, String) throws -> T) rethrows -> [T] {
128 return try rawValue.map(transform)
132 extension Parameter: Equatable {
134 public static func == (lhs: Parameter, rhs: Parameter) -> Bool {
135 return lhs.rawValue == rhs.rawValue
142 let parameter: Parameter
147 if let r = json["api_result"].int { return r == 1 }
152 init(api: API, parameter: Parameter, json: JSON) {
155 self.parameter = parameter
160 init?(request: URLRequest, data: Data) {
164 guard let josn = splitJSON(data) else {
166 Logger.shared.log("Can not parse JSON")
170 self.json = JSON(parseJSON: josn)
172 guard let parameter = Parameter(request) else {
174 Logger.shared.log("Can not parse Parameter")
178 self.parameter = parameter
180 guard let api = request.url?.path else {
182 Logger.shared.log("URLRequest is wrong")
186 self.api = API(endpointPath: api)