File size: 1,172 Bytes
4fc4790
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import Foundation

public enum LogLevel: String, Comparable, CaseIterable, Sendable {
    case trace, debug, info, warn, error

    var rank: Int {
        switch self {
        case .trace: 0
        case .debug: 1
        case .info: 2
        case .warn: 3
        case .error: 4
        }
    }

    public static func < (lhs: LogLevel, rhs: LogLevel) -> Bool { lhs.rank < rhs.rank }
}

public struct Logger: Sendable {
    public let level: LogLevel

    public init(level: LogLevel) { self.level = level }

    public func log(_ level: LogLevel, _ message: String) {
        guard level >= self.level else { return }
        let ts = ISO8601DateFormatter().string(from: Date())
        print("[\(level.rawValue.uppercased())] \(ts) | \(message)")
    }

    public func trace(_ msg: String) { log(.trace, msg) }
    public func debug(_ msg: String) { log(.debug, msg) }
    public func info(_ msg: String) { log(.info, msg) }
    public func warn(_ msg: String) { log(.warn, msg) }
    public func error(_ msg: String) { log(.error, msg) }
}

extension LogLevel {
    public init?(configValue: String) {
        self.init(rawValue: configValue.lowercased())
    }
}