// // Hashtag.swift // Pachyderm // // Created by Shadowfacts on 9/9/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import Foundation import WebURL import WebURLFoundationExtras public class Hashtag: Codable { public let name: String public let url: URL /// Only present when returned from the trending hashtags endpoint public let history: [History]? public init(name: String, url: URL) { self.name = name self.url = url self.history = nil } public required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.name = try container.decode(String.self, forKey: .name) // pixelfed (possibly others) don't fully escape special characters in the hashtag url do { let webURL = try container.decode(WebURL.self, forKey: .url) if let url = URL(webURL) { self.url = url } else { let s = try? container.decode(String.self, forKey: .url) throw DecodingError.dataCorruptedError(forKey: .url, in: container, debugDescription: "unable to convert WebURL \(s?.debugDescription ?? "nil") to URL") } } catch { self.url = try container.decode(URL.self, forKey: .url) } self.history = try container.decodeIfPresent([History].self, forKey: .history) } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(name, forKey: .name) try container.encode(url.absoluteString, forKey: .url) try container.encodeIfPresent(history, forKey: .history) } private enum CodingKeys: String, CodingKey { case name case url case history } } 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) } }