macsync/@packages/shared/Sources/MacSyncShared/Storage/ActivityLog.swift

54 lines
1.6 KiB
Swift

import Foundation
public struct LogEntry: Identifiable, Equatable, Sendable {
public let id = UUID()
public let timestamp: Date
public let message: String
public let level: LogLevel
public enum LogLevel: Sendable {
case info
case success
case warning
case error
public var icon: String {
switch self {
case .info: return "info.circle"
case .success: return "checkmark.circle"
case .warning: return "exclamationmark.triangle"
case .error: return "xmark.circle"
}
}
}
public static func == (lhs: LogEntry, rhs: LogEntry) -> Bool {
lhs.id == rhs.id
}
}
@MainActor
public class ActivityLog: ObservableObject {
public static let shared = ActivityLog()
@Published public private(set) var entries: [LogEntry] = []
private let maxEntries = 50
private init() {}
public func log(_ message: String, level: LogEntry.LogLevel = .info) {
let entry = LogEntry(timestamp: Date(), message: message, level: level)
entries.insert(entry, at: 0)
if entries.count > maxEntries {
entries = Array(entries.prefix(maxEntries))
}
NSLog("ActivityLog: [\(level)] \(message)")
}
public func info(_ message: String) { log(message, level: .info) }
public func success(_ message: String) { log(message, level: .success) }
public func warning(_ message: String) { log(message, level: .warning) }
public func error(_ message: String) { log(message, level: .error) }
public func clear() { entries.removeAll() }
}