64 lines
1.9 KiB
Swift
64 lines
1.9 KiB
Swift
//
|
|
// 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<NSManagedObjectID> {
|
|
let req = NSFetchRequest<NSManagedObjectID>(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<Item>? {
|
|
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
|
|
}
|
|
}
|