OSDN Git Service

Doutakuを導入
[kcd/KCD.git] / KCD / Parameter.swift
1 //
2 //  Parameter.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/12/12.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Foundation
10
11 private func parseParameter(_ request: URLRequest) -> [String: String]? {
12     
13     return request
14         .httpBody?
15         .utf8String?
16         .removingPercentEncoding?
17         .components(separatedBy: "&")
18         .map { $0.components(separatedBy: "=") }
19         .filter { $0.count == 2 }
20         .reduce(into: [String: String]()) { (dict: inout [String: String], value: [String]) in
21             
22             dict[value[0]] = value[1]
23     }
24 }
25
26 struct ParameterValue {
27     
28     private let rawValue: String?
29     
30     var int: Int? { return rawValue.flatMap { Int($0) } }
31     var double: Double? { return rawValue.flatMap { Double($0) } }
32     var string: String? { return rawValue }
33     var bool: Bool? {
34         
35         guard let _ = rawValue else { return nil }
36         
37         if let i = self.int {
38             
39             return i != 0
40         }
41         
42         if let s = self.string?.lowercased() {
43             
44             switch s {
45             case "true", "yes", "t", "y": return true
46                 
47             default: return false
48             }
49         }
50         
51         return false
52     }
53     var array: [ParameterValue] {
54         
55         return rawValue?.components(separatedBy: ",").map { ParameterValue($0) } ?? []
56     }
57     var integerArray: [Int] {
58         
59         return array.compactMap { $0.int }
60     }
61     
62     var valid: Bool { return rawValue != nil }
63     
64     init(_ rawValue: String?) {
65         
66         self.rawValue = rawValue
67     }
68 }
69
70 struct Parameter {
71     
72     private let rawValue: [String: String]
73     
74     init(_ rawValue: [String: String]) {
75         
76         self.rawValue = rawValue
77     }
78     
79     init?(_ request: URLRequest) {
80         
81         guard let paramList = parseParameter(request) else { return nil }
82         
83         self.init(paramList)
84     }
85     
86     subscript(_ key: String) -> ParameterValue {
87         
88         return ParameterValue(rawValue[key])
89     }
90     
91     func map<T>(_ transform: (String, String) throws -> T) rethrows -> [T] {
92         
93         return try rawValue.map(transform)
94     }
95 }
96
97 extension Parameter: Equatable {
98     
99     public static func == (lhs: Parameter, rhs: Parameter) -> Bool {
100         return lhs.rawValue == rhs.rawValue
101     }
102 }