115 lines
2.4 KiB
Swift
115 lines
2.4 KiB
Swift
//
|
||
// Account.swift
|
||
// DataModel
|
||
//
|
||
// Created by Brent Simmons on 7/1/17.
|
||
// Copyright © 2017 Ranchero Software, LLC. All rights reserved.
|
||
//
|
||
|
||
import Foundation
|
||
import RSCore
|
||
|
||
// Various model objects include an accountInfo property that Accounts can use to store extra data.
|
||
public typealias AccountInfo = [String: Any]
|
||
|
||
public enum AccountType: Int {
|
||
|
||
// Raw values should not change since they’re stored on disk.
|
||
case onMyMac = 1
|
||
case feedly = 16
|
||
case feedbin = 17
|
||
case feedWrangler = 18
|
||
case newsBlur = 19
|
||
// TODO: more
|
||
}
|
||
|
||
public final class Account: Hashable {
|
||
|
||
public let identifier: String
|
||
public let type: AccountType
|
||
public var nameForDisplay: String?
|
||
public let delegate: AccountDelegate
|
||
public let hashValue: Int
|
||
let settingsFile: String
|
||
let dataFolder: String
|
||
var topLevelObjects = [AnyObject]()
|
||
var feedIDDictionary = [String: Feed]()
|
||
var username: String?
|
||
var accountInfo = AccountInfo()
|
||
|
||
init(settingsFile: String, type: AccountType, dataFolder: String, identifier: String, delegate: AccountDelegate) {
|
||
|
||
self.identifier = identifier
|
||
self.type = type
|
||
self.settingsFile = settingsFile
|
||
self.dataFolder = dataFolder
|
||
self.delegate = delegate
|
||
self.hashValue = identifier.hashValue
|
||
}
|
||
|
||
public class func ==(lhs: Account, rhs: Account) -> Bool {
|
||
|
||
return lhs === rhs
|
||
}
|
||
}
|
||
|
||
extension Account: Container {
|
||
|
||
public func hasAtLeastOneFeed() -> Bool {
|
||
|
||
return !feedIDDictionary.isEmpty
|
||
}
|
||
|
||
public func flattenedFeeds() -> Set<Feed> {
|
||
|
||
return Set(feedIDDictionary.values)
|
||
}
|
||
|
||
public func existingFeed(with feedID: String) -> Feed? {
|
||
|
||
return feedIDDictionary[feedID]
|
||
}
|
||
|
||
public func canAddItem(_ item: AnyObject) -> Bool {
|
||
|
||
return delegate.canAddItem(item, toContainer: self)
|
||
}
|
||
|
||
public func isChild(_ obj: AnyObject) -> Bool {
|
||
|
||
return topLevelObjects.contains(where: { (oneObject) -> Bool in
|
||
return oneObject === obj
|
||
})
|
||
}
|
||
|
||
public func visitObjects(_ recurse: Bool, _ visitBlock: VisitBlock) -> Bool {
|
||
|
||
for oneObject in topLevelObjects {
|
||
|
||
if let oneContainer = oneObject as? Container {
|
||
if visitBlock(oneObject) {
|
||
return true
|
||
}
|
||
if recurse && oneContainer.visitObjects(recurse, visitBlock) {
|
||
return true
|
||
}
|
||
}
|
||
else {
|
||
if visitBlock(oneObject) {
|
||
return true
|
||
}
|
||
}
|
||
}
|
||
|
||
return false
|
||
}
|
||
}
|
||
|
||
extension Account: PlistProvider {
|
||
|
||
public func plist() -> AnyObject? {
|
||
return nil // TODO
|
||
}
|
||
}
|
||
|