krz/hutch
an ios client for sourcehut
clone: git clone https://gitbay.org/krz/hutch.git
v2.14.0: 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}