added iOS source code
[wl-app.git] / iOS / Pods / MatomoTracker / MatomoTracker / Logger.swift
1 import Foundation
2
3 @objc public enum LogLevel: Int {
4     case verbose = 10
5     case debug = 20
6     case info = 30
7     case warning = 40
8     case error = 50
9     
10     var shortcut: String {
11         switch self {
12         case .error: return "E"
13         case .warning: return "W"
14         case .info: return "I"
15         case .debug: return "D"
16         case .verbose: return "V"
17         }
18     }
19 }
20
21 /// The Logger protocol defines a common interface that is used to log every message from the sdk.
22 /// You can easily writer your own to perform custom logging.
23 @objc public protocol Logger {
24     /// This method should perform the logging. It can be called from every thread. The implementation has
25     /// to handle synchronizing different threads.
26     ///
27     /// - Parameters:
28     ///   - message: A closure that produces the message itself.
29     ///   - level: The loglevel of the message.
30     ///   - file: The filename where the log was created.
31     ///   - function: The funciton where the log was created.
32     ///   - line: Then line where the log was created.
33     func log(_ message: @autoclosure () -> String, with level: LogLevel, file: String, function: String, line: Int)
34 }
35
36 extension Logger {
37     func verbose(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line) {
38         log(message, with: .verbose, file: file, function: function, line: line)
39     }
40     func debug(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line) {
41         log(message, with: .debug, file: file, function: function, line: line)
42     }
43     func info(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line) {
44         log(message, with: .info, file: file, function: function, line: line)
45     }
46     func warning(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line) {
47         log(message, with: .warning, file: file, function: function, line: line)
48     }
49     func error(_ message: @autoclosure () -> String, file: String = #file, function: String = #function, line: Int = #line) {
50         log(message, with: .error, file: file, function: function, line: line)
51     }
52 }
53
54 /// This Logger does nothing and skips every logging.
55 public final class DisabledLogger: Logger {
56     public func log(_ message: @autoclosure () -> String, with level: LogLevel, file: String = #file, function: String = #function, line: Int = #line) { }
57 }
58
59 /// This Logger loggs every message to the console with a `print` statement.
60 @objc public final class DefaultLogger: NSObject, Logger {
61     private let dispatchQueue = DispatchQueue(label: "DefaultLogger", qos: .background)
62     private let minLevel: LogLevel
63     
64     @objc public init(minLevel: LogLevel) {
65         self.minLevel = minLevel
66         super.init()
67     }
68     
69     public func log(_ message: @autoclosure () -> String, with level: LogLevel, file: String = #file, function: String = #function, line: Int = #line) {
70         guard level.rawValue >= minLevel.rawValue else { return }
71         let messageToPrint = message()
72         dispatchQueue.async {
73             print("MatomoTracker [\(level.shortcut)] \(messageToPrint)")
74         }
75     }
76 }