OSDN Git Service

swiftlint 'line_length'の警告を修正
[kcd/KCD.git] / KCD / APIResponse.swift
1 //
2 //  APIResponse.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/20.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 fileprivate extension Data {
12     var utf8String: String? { return String(data: self, encoding: .utf8) }
13 }
14 fileprivate extension Dictionary {
15     func apended(_ keyValue: (Key, Value) ) -> Dictionary {
16         var dict  = self
17         dict[keyValue.0] = keyValue.1
18         return dict
19     }
20 }
21
22 fileprivate func splitJSON(_ data: Data) -> Data? {
23     let prefix = "svdata="
24     guard let string = data.utf8String,
25         let range = string.range(of: prefix)
26         else {
27             print("data is wrong")
28             return nil
29     }
30     return string[range.upperBound..<string.endIndex].data(using: .utf8)
31 }
32 fileprivate func parseJSON(_ data: Data?) -> [String: Any]? {
33     guard let data = data,
34         let j = try? JSONSerialization.jsonObject(with: data, options: [.allowFragments]),
35         let json = j as? [String: Any]
36         else { return nil }
37     return json
38 }
39
40 fileprivate func parseParameter(_ request: URLRequest) -> [String: String]? {
41     return request
42         .httpBody?
43         .utf8String?
44         .removingPercentEncoding?
45         .components(separatedBy: "&")
46         .map { $0.components(separatedBy: "=") }
47         .filter { $0.count == 2 }
48         .map { ($0[0], $0[1]) }
49         .reduce([String: String]()) { $0.apended($1) }
50 }
51
52 struct APIResponse {
53     let api: String
54     let parameter: [String: String]
55     let json: [String: Any]
56     let date: Date
57     var success: Bool {
58         if let r = json["api_result"] as? Int { return r == 1 }
59         return false
60     }
61     
62     init?(request: URLRequest, data: Data) {
63         date = Date()
64         
65         guard let json = parseJSON(splitJSON(data))
66             else {
67                 print("Can not parse JSON")
68                 return nil
69         }
70         self.json = json
71         
72         guard let parameter = parseParameter(request)
73             else {
74                 print("Can not parse Parameter")
75                 return nil
76         }
77         self.parameter = parameter
78         
79         guard let api = request.url?.path
80             else {
81                 print("URLRequest is wrong")
82                 return nil
83         }
84         self.api = api
85     }
86 }