Skip to content

Commit 2c8638e

Browse files
CameronMcWilliamkilnerm
authored andcommitted
Support custom encoding formats for optional Date fields
1 parent fe5c9b0 commit 2c8638e

1 file changed

Lines changed: 37 additions & 4 deletions

File tree

Sources/SwiftKueryORM/DatabaseDecoder.swift

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -337,10 +337,43 @@ open class DatabaseDecoder {
337337
let uuid = UUID(uuidString: castValue)
338338
return try castedValue(uuid, type, key)
339339
} else if type is Date.Type {
340-
let castValue = try castedValue(value, Double.self, key)
341-
let date = Date(timeIntervalSinceReferenceDate: castValue)
342-
return try castedValue(date, type, key)
343-
} else {
340+
switch decoder.dateEncodingStrategy {
341+
case .double:
342+
let castValue = try castedValue(value, Double.self, key)
343+
let date = Date(timeIntervalSinceReferenceDate: castValue)
344+
return try castedValue(date, type, key)
345+
case .timestamp:
346+
if let dateValue = value as? Date {
347+
return try castedValue(dateValue, type.self, key)
348+
} else {
349+
let castValue = try castedValue(value, String.self, key)
350+
let dateFormatter = DateFormatter()
351+
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
352+
let date = dateFormatter.date(from: castValue)
353+
return try castedValue(date, type.self, key)
354+
}
355+
case .date:
356+
if let dateValue = value as? Date {
357+
return try castedValue(dateValue, type.self, key)
358+
} else {
359+
let castValue = try castedValue(value, String.self, key)
360+
let dateFormatter = DateFormatter()
361+
dateFormatter.dateFormat = "yyyy-MM-dd"
362+
let date = dateFormatter.date(from: castValue)
363+
return try castedValue(date, type.self, key)
364+
}
365+
case .time:
366+
if let dateValue = value as? Date {
367+
return try castedValue(dateValue, type.self, key)
368+
} else {
369+
let castValue = try castedValue(value, String.self, key)
370+
let dateFormatter = DateFormatter()
371+
dateFormatter.dateFormat = "HH:mm:ss"
372+
let date = dateFormatter.date(from: castValue)
373+
return try castedValue(date, type.self, key)
374+
}
375+
}
376+
} else {
344377
throw RequestError(.ormDatabaseDecodingError, reason: "Unsupported type: \(String(describing: type)) for value: \(String(describing: value))")
345378
}
346379
}

0 commit comments

Comments
 (0)