95 lines
2.6 KiB
Swift
95 lines
2.6 KiB
Swift
//
|
|
// SearchResultItem.swift
|
|
// Mastodon
|
|
//
|
|
// Created by sxiaojian on 2021/4/6.
|
|
//
|
|
|
|
import CoreData
|
|
import Foundation
|
|
import MastodonSDK
|
|
|
|
enum SearchResultItem {
|
|
case hashtag(tag: Mastodon.Entity.Tag)
|
|
case account(account: Mastodon.Entity.Account)
|
|
case status(statusObjectID: NSManagedObjectID, attribute: Item.StatusAttribute)
|
|
case bottomLoader(attribute: BottomLoaderAttribute)
|
|
}
|
|
|
|
extension SearchResultItem {
|
|
class BottomLoaderAttribute: Hashable {
|
|
let id = UUID()
|
|
|
|
var isNoResult: Bool
|
|
|
|
init(isEmptyResult: Bool) {
|
|
self.isNoResult = isEmptyResult
|
|
}
|
|
|
|
static func == (lhs: SearchResultItem.BottomLoaderAttribute, rhs: SearchResultItem.BottomLoaderAttribute) -> Bool {
|
|
return lhs.id == rhs.id
|
|
}
|
|
|
|
func hash(into hasher: inout Hasher) {
|
|
hasher.combine(id)
|
|
}
|
|
}
|
|
}
|
|
|
|
extension SearchResultItem: Equatable {
|
|
static func == (lhs: SearchResultItem, rhs: SearchResultItem) -> Bool {
|
|
switch (lhs, rhs) {
|
|
case (.hashtag(let tagLeft), .hashtag(let tagRight)):
|
|
return tagLeft == tagRight
|
|
case (.account(let accountLeft), .account(let accountRight)):
|
|
return accountLeft == accountRight
|
|
case (.status(let idLeft, _), .status(let idRight, _)):
|
|
return idLeft == idRight
|
|
case (.bottomLoader(let attributeLeft), .bottomLoader(let attributeRight)):
|
|
return attributeLeft == attributeRight
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
|
|
extension SearchResultItem: Hashable {
|
|
func hash(into hasher: inout Hasher) {
|
|
switch self {
|
|
case .account(let account):
|
|
hasher.combine(String(describing: SearchResultItem.account.self))
|
|
hasher.combine(account.id)
|
|
case .hashtag(let tag):
|
|
hasher.combine(String(describing: SearchResultItem.hashtag.self))
|
|
hasher.combine(tag.name)
|
|
case .status(let id, _):
|
|
hasher.combine(id)
|
|
case .bottomLoader(let attribute):
|
|
hasher.combine(attribute)
|
|
}
|
|
}
|
|
}
|
|
|
|
extension SearchResultItem {
|
|
var sortKey: String? {
|
|
switch self {
|
|
case .account(let account): return account.displayName.lowercased()
|
|
case .hashtag(let hashtag): return hashtag.name.lowercased()
|
|
default: return nil
|
|
}
|
|
}
|
|
}
|
|
|
|
extension SearchResultItem {
|
|
var statusObjectItem: StatusObjectItem? {
|
|
switch self {
|
|
case .status(let objectID, _):
|
|
return .status(objectID: objectID)
|
|
case .hashtag,
|
|
.account,
|
|
.bottomLoader:
|
|
return nil
|
|
}
|
|
}
|
|
}
|