import Foundation class DanbooruPostParser { private let data: Data init(data: Data) { self.data = data } func parse() -> [BooruPost] { let decoder = JSONDecoder() decoder.dateDecodingStrategy = .custom { decoder in self.parseDate( try (try decoder.singleValueContainer()).decode(String.self) ) ?? Date() } do { return try decoder.decode([DanbooruPost].self, from: data).compactMap { post in post.toBooruPost() } } catch { return [] } } private func parseDate(_ input: String) -> Date? { let isoFormatter = ISO8601DateFormatter() isoFormatter.formatOptions = [.withInternetDateTime, .withFractionalSeconds] if let date = isoFormatter.date(from: input) { return date } let alternativeFormatter = DateFormatter() alternativeFormatter.dateFormat = "EEE MMM dd HH:mm:ss Z yyyy" alternativeFormatter.locale = Locale(identifier: "en_US_POSIX") if let date = alternativeFormatter.date(from: input) { return date } if let timestamp = Double(input) { return Date(timeIntervalSince1970: timestamp) } return nil } }