55 lines
1.3 KiB
Swift
55 lines
1.3 KiB
Swift
//
|
|
// StatusManager.swift
|
|
// MongoView
|
|
//
|
|
// Created by Shadowfacts on 7/7/20.
|
|
// Copyright © 2020 Shadowfacts. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
struct StatusManager {
|
|
private(set) var statuses = [Category: Status]()
|
|
|
|
var mostRelevant: Status? {
|
|
for category in Category.sortedByPriority {
|
|
if let status = statuses[category] {
|
|
return status
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
mutating func set(_ message: String, for category: Category, override: Bool = false) {
|
|
statuses[category] = Status(message: message, category: category)
|
|
|
|
if override {
|
|
for other in Category.allCases where other < category {
|
|
remove(for: other)
|
|
}
|
|
}
|
|
}
|
|
|
|
mutating func remove(for category: Category) {
|
|
statuses.removeValue(forKey: category)
|
|
}
|
|
|
|
enum Category: Int, Comparable, CaseIterable {
|
|
case document
|
|
case query
|
|
case connection
|
|
|
|
static let sortedByPriority = allCases.sorted()
|
|
|
|
static func < (lhs: StatusManager.Category, rhs: StatusManager.Category) -> Bool {
|
|
return lhs.rawValue < rhs.rawValue
|
|
}
|
|
}
|
|
|
|
struct Status {
|
|
let message: String
|
|
let category: Category
|
|
let timestamp = Date()
|
|
}
|
|
}
|