krz/hutch

an ios client for sourcehut

clone: git clone https://gitbay.org/krz/hutch.git

v3.1.5: Hutch/Extensions/DateFormatter+SRHT.swift · raw

 1import Foundation
 2
 3extension DateFormatter {
 4    /// Formatter for the sr.ht `Time` scalar: `%Y-%m-%dT%H:%M:%SZ` (UTC).
 5    static let srht: DateFormatter = {
 6        let formatter = DateFormatter()
 7        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
 8        formatter.locale = Locale(identifier: "en_US_POSIX")
 9        formatter.timeZone = TimeZone(identifier: "UTC")
10        return formatter
11    }()
12
13    /// Fallback formatter that also accepts fractional seconds.
14    static let srhtFractional: DateFormatter = {
15        let formatter = DateFormatter()
16        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
17        formatter.locale = Locale(identifier: "en_US_POSIX")
18        formatter.timeZone = TimeZone(identifier: "UTC")
19        return formatter
20    }()
21}
22
23extension JSONDecoder.DateDecodingStrategy {
24    /// Tries the primary sr.ht format first, then falls back to fractional seconds.
25    static let srhtFlexible: JSONDecoder.DateDecodingStrategy = .custom { decoder in
26        let container = try decoder.singleValueContainer()
27        let string = try container.decode(String.self)
28        if let date = DateFormatter.srht.date(from: string) {
29            return date
30        }
31        if let date = DateFormatter.srhtFractional.date(from: string) {
32            return date
33        }
34        throw DecodingError.dataCorruptedError(
35            in: container,
36            debugDescription: "Cannot decode date string: \(string)"
37        )
38    }
39}