|
1 | 1 | import Foundation
|
2 | 2 |
|
3 | 3 | /// Capable of converting to / from `RESPValue`.
|
4 |
| -public protocol RESPConvertible { |
5 |
| - /// Create an instance of `Self` from `RESPValue`. |
6 |
| - static func convertFromRESP(_ value: RESPValue) throws -> Self |
| 4 | +public protocol RESPValueConvertible { |
| 5 | + init?(_ value: RESPValue) |
7 | 6 |
|
8 |
| - /// Convert self to `RESPValue`. |
9 |
| - func convertToRESP() throws -> RESPValue |
| 7 | + /// Creates a `RESPValue` representation. |
| 8 | + func convertedToRESPValue() -> RESPValue |
10 | 9 | }
|
11 | 10 |
|
12 |
| -extension RESPValue: RESPConvertible { |
13 |
| - /// See `RESPValueConvertible`. |
14 |
| - public func convertToRESP() throws -> RESPValue { |
15 |
| - return self |
| 11 | +extension RESPValue: RESPValueConvertible { |
| 12 | + public init?(_ value: RESPValue) { |
| 13 | + self = value |
16 | 14 | }
|
17 | 15 |
|
18 |
| - /// See `RESPValueConvertible`. |
19 |
| - public static func convertFromRESP(_ value: RESPValue) throws -> RESPValue { |
20 |
| - return value |
| 16 | + /// See `RESPValueConvertible` |
| 17 | + public func convertedToRESPValue() -> RESPValue { |
| 18 | + return self |
21 | 19 | }
|
22 | 20 | }
|
23 | 21 |
|
24 |
| -extension String: RESPConvertible { |
25 |
| - /// See `RESPValueConvertible`. |
26 |
| - public static func convertFromRESP(_ value: RESPValue) throws -> String { |
27 |
| - guard let string = value.string else { |
28 |
| - throw RedisError(identifier: "string", reason: "Could not convert to string: \(value).") |
29 |
| - } |
30 |
| - return string |
| 22 | +extension String: RESPValueConvertible { |
| 23 | + public init?(_ value: RESPValue) { |
| 24 | + guard let string = value.string else { return nil } |
| 25 | + self = string |
31 | 26 | }
|
32 | 27 |
|
33 | 28 | /// See `RESPValueConvertible`.
|
34 |
| - public func convertToRESP() throws -> RESPValue { |
| 29 | + public func convertedToRESPValue() -> RESPValue { |
35 | 30 | return .bulkString(Data(self.utf8))
|
36 | 31 | }
|
37 | 32 | }
|
38 | 33 |
|
39 | 34 | extension FixedWidthInteger {
|
40 |
| - /// See `RESPValueConvertible`. |
41 |
| - public static func convertFromRESP(_ value: RESPValue) throws -> Self { |
42 |
| - guard let int = value.int else { |
43 |
| - guard let string = value.string else { |
44 |
| - throw RedisError(identifier: "string", reason: "Could not convert to string: \(value)") |
45 |
| - } |
46 |
| - |
47 |
| - guard let int = Self(string) else { |
48 |
| - throw RedisError(identifier: "int", reason: "Could not convert to int: \(value)") |
49 |
| - } |
50 |
| - |
51 |
| - return int |
| 35 | + public init?(_ value: RESPValue) { |
| 36 | + if let int = value.int { |
| 37 | + self = Self(int) |
| 38 | + } else { |
| 39 | + guard let string = value.string else { return nil } |
| 40 | + guard let int = Self(string) else { return nil } |
| 41 | + self = Self(int) |
52 | 42 | }
|
53 |
| - |
54 |
| - return Self(int) |
55 | 43 | }
|
56 | 44 |
|
57 |
| - /// See `RESPValueConvertible`. |
58 |
| - public func convertToRESP() throws -> RESPValue { |
| 45 | + /// See `convertedToRESP`. |
| 46 | + public func convertedToRESPValue() -> RESPValue { |
59 | 47 | return .bulkString(Data(self.description.utf8))
|
60 | 48 | }
|
61 | 49 | }
|
62 | 50 |
|
63 |
| -extension Int: RESPConvertible {} |
64 |
| -extension Int8: RESPConvertible {} |
65 |
| -extension Int16: RESPConvertible {} |
66 |
| -extension Int32: RESPConvertible {} |
67 |
| -extension Int64: RESPConvertible {} |
68 |
| -extension UInt: RESPConvertible {} |
69 |
| -extension UInt8: RESPConvertible {} |
70 |
| -extension UInt16: RESPConvertible {} |
71 |
| -extension UInt32: RESPConvertible {} |
72 |
| -extension UInt64: RESPConvertible {} |
73 |
| - |
74 |
| -extension Double: RESPConvertible { |
75 |
| - /// See `RESPValueConvertible`. |
76 |
| - public static func convertFromRESP(_ value: RESPValue) throws -> Double { |
77 |
| - guard let string = value.string else { |
78 |
| - throw RedisError(identifier: "string", reason: "Could not convert to string: \(value).") |
79 |
| - } |
80 |
| - |
81 |
| - guard let float = Double(string) else { |
82 |
| - throw RedisError(identifier: "double", reason: "Could not convert to double: \(value).") |
83 |
| - } |
84 |
| - |
85 |
| - return float |
| 51 | +extension Int: RESPValueConvertible {} |
| 52 | +extension Int8: RESPValueConvertible {} |
| 53 | +extension Int16: RESPValueConvertible {} |
| 54 | +extension Int32: RESPValueConvertible {} |
| 55 | +extension Int64: RESPValueConvertible {} |
| 56 | +extension UInt: RESPValueConvertible {} |
| 57 | +extension UInt8: RESPValueConvertible {} |
| 58 | +extension UInt16: RESPValueConvertible {} |
| 59 | +extension UInt32: RESPValueConvertible {} |
| 60 | +extension UInt64: RESPValueConvertible {} |
| 61 | + |
| 62 | +extension Double: RESPValueConvertible { |
| 63 | + public init?(_ value: RESPValue) { |
| 64 | + guard let string = value.string else { return nil } |
| 65 | + guard let float = Double(string) else { return nil } |
| 66 | + self = float |
86 | 67 | }
|
87 | 68 |
|
88 | 69 | /// See `RESPValueConvertible`.
|
89 |
| - public func convertToRESP() throws -> RESPValue { |
| 70 | + public func convertedToRESPValue() -> RESPValue { |
90 | 71 | return .bulkString(Data(self.description.utf8))
|
91 | 72 | }
|
92 | 73 | }
|
93 | 74 |
|
94 |
| -extension Float: RESPConvertible { |
95 |
| - /// See `RESPValueConvertible`. |
96 |
| - public static func convertFromRESP(_ value: RESPValue) throws -> Float { |
97 |
| - guard let string = value.string else { |
98 |
| - throw RedisError(identifier: "string", reason: "Could not convert to string: \(value).") |
99 |
| - } |
100 |
| - |
101 |
| - guard let float = Float(string) else { |
102 |
| - throw RedisError(identifier: "float", reason: "Could not convert to float: \(value).") |
103 |
| - } |
104 |
| - |
105 |
| - return float |
| 75 | +extension Float: RESPValueConvertible { |
| 76 | + public init?(_ value: RESPValue) { |
| 77 | + guard let string = value.string else { return nil } |
| 78 | + guard let float = Float(string) else { return nil } |
| 79 | + self = float |
106 | 80 | }
|
107 | 81 |
|
108 | 82 | /// See `RESPValueConvertible`.
|
109 |
| - public func convertToRESP() throws -> RESPValue { |
| 83 | + public func convertedToRESPValue() -> RESPValue { |
110 | 84 | return .bulkString(Data(self.description.utf8))
|
111 | 85 | }
|
112 | 86 | }
|
113 | 87 |
|
114 |
| -extension Data: RESPConvertible { |
115 |
| - /// See `RESPValueConvertible`. |
116 |
| - public static func convertFromRESP(_ value: RESPValue) throws -> Data { |
117 |
| - guard let theData = value.data else { |
118 |
| - throw RedisError(identifier: "data", reason: "Could not convert to data: \(value).") |
119 |
| - } |
120 |
| - return theData |
| 88 | +extension Data: RESPValueConvertible { |
| 89 | + public init?(_ value: RESPValue) { |
| 90 | + guard let data = value.data else { return nil } |
| 91 | + self = data |
121 | 92 | }
|
122 | 93 |
|
123 | 94 | /// See `RESPValueConvertible`.
|
124 |
| - public func convertToRESP() throws -> RESPValue { |
| 95 | + public func convertedToRESPValue() -> RESPValue { |
125 | 96 | return .bulkString(self)
|
126 | 97 | }
|
127 | 98 | }
|
128 | 99 |
|
129 |
| -extension Array: RESPConvertible where Element: RESPConvertible { |
130 |
| - /// See `RESPValueConvertible`. |
131 |
| - public static func convertFromRESP(_ value: RESPValue) throws -> Array<Element> { |
132 |
| - guard let array = value.array else { |
133 |
| - throw RedisError(identifier: "array", reason: "Could not convert to array: \(value).") |
134 |
| - } |
135 |
| - return try array.map { try Element.convertFromRESP($0) } |
| 100 | +extension Array: RESPValueConvertible where Element: RESPValueConvertible { |
| 101 | + public init?(_ value: RESPValue) { |
| 102 | + guard let array = value.array else { return nil } |
| 103 | + self = array.compactMap { Element($0) } |
136 | 104 | }
|
137 | 105 |
|
138 | 106 | /// See `RESPValueConvertible`.
|
139 |
| - public func convertToRESP() throws -> RESPValue { |
140 |
| - let dataArray = try map { try $0.convertToRESP() } |
141 |
| - return RESPValue.array(dataArray) |
| 107 | + public func convertedToRESPValue() -> RESPValue { |
| 108 | + let elements = map { $0.convertedToRESPValue() } |
| 109 | + return RESPValue.array(elements) |
142 | 110 | }
|
143 | 111 | }
|
0 commit comments