import Foundation struct BooruSearchQuery: Codable, Equatable, Identifiable, Hashable { var id: UUID let provider: BooruProvider let tags: [String] let searchedAt: Date var page: Int enum CodingKeys: String, CodingKey { // swiftlint:disable:next explicit_enum_raw_value case id, provider, tags, searchedAt, page } init( provider: BooruProvider, tags: [String], searchedAt: Date = Date(), page: Int = 1 ) { self.id = UUID() self.provider = provider self.tags = tags self.searchedAt = searchedAt self.page = page } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) self.id = try container.decodeIfPresent(UUID.self, forKey: .id) ?? UUID() self.provider = try container.decodeIfPresent(BooruProvider.self, forKey: .provider) ?? .safebooru self.tags = try container.decodeIfPresent([String].self, forKey: .tags) ?? [] self.searchedAt = try container.decodeIfPresent(Date.self, forKey: .searchedAt) ?? Date() self.page = try container.decodeIfPresent(Int.self, forKey: .page) ?? 1 } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(id, forKey: .id) try container.encode(provider, forKey: .provider) try container.encode(tags, forKey: .tags) try container.encode(searchedAt, forKey: .searchedAt) try container.encode(page, forKey: .page) } }