From 9d7038f919bb5d2490143229b6688d01ef92ea08 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Wed, 5 Oct 2022 01:13:49 +0200 Subject: [PATCH] Add LogMessage model --- .../XXMessengerClient/Utils/LogMessage.swift | 48 +++++++++++++++++++ .../Utils/LogMessageTests.swift | 43 +++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 Sources/XXMessengerClient/Utils/LogMessage.swift create mode 100644 Tests/XXMessengerClientTests/Utils/LogMessageTests.swift diff --git a/Sources/XXMessengerClient/Utils/LogMessage.swift b/Sources/XXMessengerClient/Utils/LogMessage.swift new file mode 100644 index 00000000..5a213359 --- /dev/null +++ b/Sources/XXMessengerClient/Utils/LogMessage.swift @@ -0,0 +1,48 @@ +import Foundation +import Logging + +struct LogMessage: Equatable { + var level: Logger.Level + var text: String +} + +extension LogMessage { + static func parse(_ string: String) -> LogMessage? { + 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 + } + } +} diff --git a/Tests/XXMessengerClientTests/Utils/LogMessageTests.swift b/Tests/XXMessengerClientTests/Utils/LogMessageTests.swift new file mode 100644 index 00000000..c955e303 --- /dev/null +++ b/Tests/XXMessengerClientTests/Utils/LogMessageTests.swift @@ -0,0 +1,43 @@ +import CustomDump +import XCTest +@testable import XXMessengerClient + +final class LogMessageTests: XCTestCase { + func testParsing() { + XCTAssertNoDifference( + LogMessage.parse("TRACE Tracing..."), + LogMessage(level: .trace, text: "Tracing...") + ) + XCTAssertNoDifference( + LogMessage.parse("DEBUG Debugging..."), + LogMessage(level: .debug, text: "Debugging...") + ) + XCTAssertNoDifference( + LogMessage.parse("INFO Informing..."), + LogMessage(level: .info, text: "Informing...") + ) + XCTAssertNoDifference( + LogMessage.parse("WARN Warning!"), + LogMessage(level: .warning, text: "Warning!") + ) + XCTAssertNoDifference( + LogMessage.parse("ERROR Failure!"), + LogMessage(level: .error, text: "Failure!") + ) + XCTAssertNoDifference( + LogMessage.parse("CRITICAL Critical failure!"), + LogMessage(level: .critical, text: "Critical failure!") + ) + XCTAssertNoDifference( + LogMessage.parse("FATAL Fatal failure!"), + LogMessage(level: .critical, text: "Fatal failure!") + ) + } + + func testParsingFallbacks() { + XCTAssertNoDifference( + LogMessage.parse("1234 Wrongly formatted"), + LogMessage(level: .notice, text: "1234 Wrongly formatted") + ) + } +} -- GitLab