Last active
February 22, 2017 20:25
-
-
Save jnewc/f43fd5efa654d97465e12adb9a4f3734 to your computer and use it in GitHub Desktop.
Class-based logger as a protocol extension
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import Rainbow | |
public enum LogLevel: UInt { | |
case none = 0b0000 | |
case debug = 0b0001 | |
case info = 0b0011 | |
case warn = 0b0111 | |
case error = 0b1111 | |
} | |
fileprivate var LoggerCache: [String: Logger] = [:] | |
public protocol LogReporter {} | |
public extension LogReporter { | |
var logger: Logger { | |
let className = String(describing: type(of: self)) | |
if(!LoggerCache.keys.contains(className)) { | |
LoggerCache[className] = PrintLogger() | |
} | |
return LoggerCache[className]! | |
} | |
func logger<T: Logger>(with type: T) -> Logger { | |
let className = String(describing: type(of: self)) | |
if(!LoggerCache.keys.contains(className)) { | |
LoggerCache[className] = T.init() | |
} | |
return LoggerCache[className]! | |
} | |
} | |
public protocol Logger: class { | |
init() | |
var logLevel: LogLevel { set get } | |
func debug(_ messages: String ...) | |
func log(_ messages: String...) | |
func warn(_ messages: String...) | |
func error(_ messages: String...) | |
} | |
fileprivate class PrintLogger: Logger { | |
public var logLevel = LogLevel.info | |
public required init() { | |
} | |
fileprivate func printLine(_ line: String, _ color: Color) { | |
print("\(line)".applyingColor(color)) | |
} | |
private func enabled(_ expected: LogLevel) -> Bool { | |
return (logLevel.rawValue & expected.rawValue) > 0 | |
} | |
public func debug(_ messages: String...) { | |
guard enabled(.debug) else { return } | |
messages.forEach { | |
self.printLine($0, .white) | |
} | |
} | |
public func log(_ messages: String...) { | |
guard enabled(.info) else { return } | |
messages.forEach { | |
self.printLine($0, .white) | |
} | |
} | |
public func warn(_ messages: String...) { | |
guard enabled(.warn) else { return } | |
messages.forEach { | |
self.printLine($0, .yellow) | |
} | |
} | |
public func error(_ messages: String...) { | |
guard enabled(.error) else { return } | |
messages.forEach { | |
self.printLine($0, .red) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment