// // ItemListType.swift // Reader // // Created by Shadowfacts on 3/13/22. // import Foundation import CoreData import Persistence enum ItemListType: Hashable, Equatable { case unread case all case group(Group) case feed(Feed) var title: String { switch self { case .unread: return "Unread Articles" case .all: return "All Articles" case let .group(group): return group.title case let .feed(feed): return feed.title ?? feed.url?.host() ?? "Unknown Feed" } } var idFetchRequest: NSFetchRequest { let req = NSFetchRequest(entityName: "Item") req.resultType = .managedObjectIDResultType switch self { case .unread: req.predicate = NSPredicate(format: "read = NO") case .all: break case .group(let group): req.predicate = NSPredicate(format: "feed in %@", group.feeds!) case .feed(let feed): req.predicate = NSPredicate(format: "feed = %@", feed) } return req } var countFetchRequest: NSFetchRequest? { let req = Item.fetchRequest() switch self { case .unread: req.predicate = NSPredicate(format: "read = NO") case .all: return nil case .group(let group): // use the feed ids, because passing the NSSet of feeds into the predicate results in a multithreading violation if the request is used on a different context let feedIDs = group.feeds!.map { ($0 as! Feed).objectID } req.predicate = NSPredicate(format: "read = NO AND feed in %@", feedIDs) case .feed(let feed): req.predicate = NSPredicate(format: "read = NO AND feed = %@", feed) } return req } }