Skip to content

Commit f980663

Browse files
committed
hm
1 parent 3a129ba commit f980663

File tree

1 file changed

+46
-9
lines changed

1 file changed

+46
-9
lines changed

Sources/SwiftAPIClient/Utils/Coders/EncodingStrategies.swift

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,20 +139,57 @@ public extension JSONEncoder.KeyEncodingStrategy {
139139
extension JSONEncoder.DateEncodingStrategy {
140140

141141
func encode(_ date: Date, encoder: Encoder) throws {
142-
if case .deferredToDate = self {
142+
#if os(Linux) && swift(>=5.10)
143+
let jsonEncoder = JSONEncoder()
144+
jsonEncoder.dateEncodingStrategy = self
145+
146+
/// Encode the date using the current encoding strategy
147+
let encodedData = try jsonEncoder.encode(date)
148+
149+
/// Decode as CustomDate (String or Number)
150+
let value = try JSONDecoder().decode(CustomDate.self, from: encodedData)
151+
if let string = value.string {
152+
try string.encode(to: encoder)
153+
} else if let number = value.number {
154+
try number.encode(to: encoder)
155+
} else {
156+
throw EncodingError.invalidValue(
157+
value,
158+
EncodingError.Context(codingPath: encoder.codingPath, debugDescription: "Invalid date encoding.")
159+
)
160+
}
161+
#else
162+
switch self {
163+
case .deferredToDate:
143164
try date.encode(to: encoder)
144-
} else if case .secondsSince1970 = self {
145-
try date.timeIntervalSince1970.encode(to: encoder)
146-
} else if case .millisecondsSince1970 = self {
165+
case .millisecondsSince1970:
147166
try (date.timeIntervalSince1970 * 1000).encode(to: encoder)
148-
} else if case .iso8601 = self {
167+
case .secondsSince1970:
168+
try date.timeIntervalSince1970.encode(to: encoder)
169+
case .iso8601:
149170
try _iso8601Formatter.string(from: date).encode(to: encoder)
150-
} else if case let .formatted(formatter) = self {
171+
case let .formatted(formatter):
151172
try formatter.string(from: date).encode(to: encoder)
152-
} else if case let .custom(closure) = self {
173+
case let .custom(closure):
153174
try closure(date, encoder)
154-
} else {
155-
try date.timeIntervalSince1970.encode(to: encoder)
175+
@unknown default:
176+
try date.encode(to: encoder)
177+
}
178+
#endif
179+
}
180+
}
181+
182+
private struct CustomDate: Decodable {
183+
184+
var string: String?
185+
var number: Double?
186+
187+
init(from decoder: Decoder) throws {
188+
let container = try decoder.singleValueContainer()
189+
if let string = try? container.decode(String.self) {
190+
self.string = string
191+
} else if let number = try? container.decode(Double.self) {
192+
self.number = number
156193
}
157194
}
158195
}

0 commit comments

Comments
 (0)