Sources/Confidence/DebugLogger.swift (89 lines of code) (raw):

import Foundation import OSLog protocol DebugLogger { func logEvent(action: String, event: ConfidenceEvent?) func logMessage(message: String, isWarning: Bool) func logFlags(action: String, flag: String) func logFlags(action: String, context: ConfidenceStruct) func logContext(action: String, context: ConfidenceStruct) func logResolveDebugURL(flagName: String, context: ConfidenceStruct) } private extension Logger { private static var subsystem = Bundle.main.bundleIdentifier static let confidence = Logger(subsystem: subsystem ?? "", category: "confidence") } class DebugLoggerImpl: DebugLogger { private let encoder = JSONEncoder() let clientKey: String func logResolveDebugURL(flagName: String, context: ConfidenceStruct) { let ctxNetworkValue: NetworkStruct = TypeMapper.convert(structure: context) do { let ctxNetworkData = try encoder.encode(ctxNetworkValue) let resolveHintData = try [ "context": JSONSerialization.jsonObject(with: ctxNetworkData, options: []), "flag": "flags/\(flagName)", "clientKey": clientKey, ] let jsonData = try JSONSerialization.data(withJSONObject: resolveHintData, options: []) if let jsonString = String(data: jsonData, encoding: .utf8) { let base64 = Data(jsonString.utf8).base64EncodedString() let message = """ Check your flag evaluation for \(flagName) by copy pasting the payload to the Resolve tester '\(base64)' """ log(messageLevel: .DEBUG, message: message) } else { log(messageLevel: .DEBUG, message: "Could not convert JSON data to string") } } catch { log(messageLevel: .DEBUG, message: "Failed to encode resolve hint data: \(error)") } } let loggerLevel: LoggerLevel init(loggerLevel: LoggerLevel, clientKey: String) { self.loggerLevel = loggerLevel self.clientKey = clientKey } func logMessage(message: String, isWarning: Bool = false) { if isWarning { log(messageLevel: .WARN, message: message) } else { log(messageLevel: .DEBUG, message: message) } } func logEvent(action: String, event: ConfidenceEvent?) { log(messageLevel: .DEBUG, message: "[\(action)] \(event?.name ?? "")") } func logFlags(action: String, flag: String) { log(messageLevel: .TRACE, message: "[\(action)] \(flag)") } func logFlags(action: String, context: ConfidenceStruct) { log(messageLevel: .TRACE, message: "[\(action)] \(context)") } func logContext(action: String, context: ConfidenceStruct) { log(messageLevel: .TRACE, message: "[\(action)] \(context)") } func log(messageLevel: LoggerLevel, message: String) { if messageLevel >= loggerLevel { switch messageLevel { case .TRACE: Logger.confidence.trace("\(message)") case .DEBUG: Logger.confidence.debug("\(message)") case .WARN: Logger.confidence.warning("\(message)") case .ERROR: Logger.confidence.error("\(message)") case .NONE: // do nothing break } } } } public enum LoggerLevel: Comparable { case TRACE case DEBUG case WARN case ERROR case NONE }