Files
SwiftGen/Sources/SwiftGenCLI/Logs.swift
2022-07-30 20:47:39 +02:00

83 lines
1.7 KiB
Swift

//
// SwiftGen
// Copyright © 2022 SwiftGen
// MIT Licence
//
import Foundation
// MARK: Printing on stderr
public enum CommandLogLevel {
case quiet, `default`, verbose
}
public var commandLogLevel: CommandLogLevel = .default
public enum LogLevel {
case info, warning, error
}
enum ANSIColor: UInt8, CustomStringConvertible {
case reset = 0
case black = 30
case red
case green
case yellow
case blue
case magenta
case cyan
case white
case `default`
var description: String {
"\u{001B}[\(self.rawValue)m"
}
func format(_ string: String) -> String {
if let termType = getenv("TERM"), String(cString: termType).lowercased() != "dumb" &&
isatty(fileno(stdout)) != 0 {
return "\(self)\(string)\(Self.reset)"
} else {
return string
}
}
}
// Based on https://github.com/realm/SwiftLint/blob/0.39.2/Source/SwiftLintFramework/Extensions/QueuedPrint.swift
public func logMessage(_ level: LogLevel, _ string: CustomStringConvertible) {
kLogQueue.async {
switch (level, commandLogLevel) {
case (.info, .quiet):
break
case (.info, _):
fputs(ANSIColor.green.format("\(string)\n"), stdout)
case (.warning, .quiet):
break
case (.warning, _):
fputs(ANSIColor.yellow.format("swiftgen: warning: \(string)\n"), stderr)
case (.error, _):
fputs(ANSIColor.red.format("swiftgen: error: \(string)\n"), stderr)
}
}
}
private let kLogQueue: DispatchQueue = {
let queue = DispatchQueue(
label: "swiftgen.log.queue",
qos: .userInteractive,
target: .global(qos: .userInteractive)
)
// Make sure all the logs are printed before exiting the program
#if !os(Linux)
atexit_b {
queue.sync(flags: .barrier) {}
}
#endif
return queue
}()