Newer
Older
public struct LogMessage: Equatable {
public init(level: Logger.Level, text: String) {
self.level = level
self.text = text
}
public var level: Logger.Level
public var text: String
public static func parse(_ string: String) -> LogMessage {
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
43
44
45
46
47
48
49
50
51
52
53
let level: Logger.Level
let text: String
let pattern = #"([A-Z]+) (.*)"#
let regex = try! NSRegularExpression(pattern: pattern)
let stringRange = NSRange(location: 0, length: string.utf16.count)
if let match = regex.firstMatch(in: string, range: stringRange) {
var groups: [Int: String] = [:]
for rangeIndex in 1..<match.numberOfRanges {
let nsRange = match.range(at: rangeIndex)
if !NSEqualRanges(nsRange, NSMakeRange(NSNotFound, 0)) {
let group = (string as NSString).substring(with: nsRange)
groups[rangeIndex] = group
}
}
level = .fromString(groups[1])
text = groups[2] ?? string
} else {
level = .notice
text = string
}
return LogMessage(level: level, text: text)
}
}
private extension Logger.Level {
static func fromString(_ string: String?) -> Logger.Level {
switch string {
case "TRACE": return .trace
case "DEBUG": return .debug
case "INFO": return .info
case "WARN": return .warning
case "ERROR": return .error
case "CRITICAL": return .critical
case "FATAL": return .critical
default: return .notice
}
}
}