OSDN Git Service

関数名を変更
[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         .map { (piar: [String]) -> (String, String) in (piar[0], piar[1]) }
21         .reduce(into: [String: String]()) { (dict: inout [String: String], value: (String, String)) in
22             
23             dict[value.0] = value.1
24     }
25 }
26
27 struct ParameterValue {
28     
29     private let rawValue: String?
30     
31     var int: Int? { return rawValue.flatMap { Int($0) } }
32     var double: Double? { return rawValue.flatMap { Double($0) } }
33     var string: String? { return rawValue }
34     var bool: Bool? {
35         
36         guard let _ = rawValue else { return nil }
37         
38         if let i = self.int {
39             
40             return i != 0
41         }
42         
43         if let s = self.string?.lowercased() {
44             
45             switch s {
46             case "true", "yes", "t", "y": return true
47                 
48             default: return false
49             }
50         }
51         
52         return false
53     }
54     var array: [ParameterValue] {
55         
56         return rawValue?.components(separatedBy: ",").map { ParameterValue($0) } ?? []
57     }
58     var integerArray: [Int] {
59         
60         return array.flatMap { $0.int }
61     }
62     
63     var valid: Bool { return rawValue != nil }
64     
65     init(_ rawValue: String?) {
66         
67         self.rawValue = rawValue
68     }
69 }
70
71 struct Parameter {
72     
73     private let rawValue: [String: String]
74     
75     init(_ rawValue: [String: String]) {
76         
77         self.rawValue = rawValue
78     }
79     
80     init?(_ request: URLRequest) {
81         
82         guard let paramList = parseParameter(request) else { return nil }
83         
84         self.init(paramList)
85     }
86     
87     subscript(_ key: String) -> ParameterValue {
88         
89         return ParameterValue(rawValue[key])
90     }
91     
92     func map<T>(_ transform: (String, String) throws -> T) rethrows -> [T] {
93         
94         return try rawValue.map(transform)
95     }
96 }
97
98 extension Parameter: Equatable {
99     
100     public static func == (lhs: Parameter, rhs: Parameter) -> Bool {
101         return lhs.rawValue == rhs.rawValue
102     }
103 }