// // Hashtag.swift // Pachyderm // // Created by Shadowfacts on 9/9/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import Foundation public class Hashtag: Codable { public let name: String public let url: URL public let history: [History]? public init(name: String, url: URL) { self.name = name self.url = url self.history = nil } private enum CodingKeys: String, CodingKey { case name case url case history } } extension Hashtag { public class History: Codable { public let day: Date public let uses: Int public let accounts: Int public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) if let day = try? container.decode(Date.self, forKey: .day) { self.day = day } else if let unixTimestamp = try? container.decode(Double.self, forKey: .day) { self.day = Date(timeIntervalSince1970: unixTimestamp) } else if let str = try? container.decode(String.self, forKey: .day), let unixTimestamp = Double(str) { self.day = Date(timeIntervalSince1970: unixTimestamp) } else { throw DecodingError.dataCorruptedError(forKey: .day, in: container, debugDescription: "day must be either date or UNIX timestamp") } if let uses = try? container.decode(Int.self, forKey: .uses) { self.uses = uses } else if let str = try? container.decode(String.self, forKey: .uses), let uses = Int(str) { self.uses = uses } else { throw DecodingError.dataCorruptedError(forKey: .uses, in: container, debugDescription: "uses must either be int or string containing int") } if let accounts = try? container.decode(Int.self, forKey: .accounts) { self.accounts = accounts } else if let str = try? container.decode(String.self, forKey: .accounts), let accounts = Int(str) { self.accounts = accounts } else { throw DecodingError.dataCorruptedError(forKey: .accounts, in: container, debugDescription: "accounts must either be int or string containing int") } } private enum CodingKeys: String, CodingKey { case day case uses case accounts } } } extension Hashtag: Equatable, Hashable { public static func ==(lhs: Hashtag, rhs: Hashtag) -> Bool { return lhs.name == rhs.name } public func hash(into hasher: inout Hasher) { hasher.combine(url) } }