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