Files
Sybil-2/ios/Packages/Sybil/Sources/Sybil/SybilLog.swift
2026-02-20 00:09:02 -08:00

64 lines
2.3 KiB
Swift

import Foundation
import OSLog
enum SybilLog {
private static let subsystem = "com.sybil.ios"
static let app = Logger(subsystem: subsystem, category: "app")
static let network = Logger(subsystem: subsystem, category: "network")
static let ui = Logger(subsystem: subsystem, category: "ui")
static func info(_ logger: Logger, _ message: String) {
logger.info("\(message, privacy: .public)")
}
static func debug(_ logger: Logger, _ message: String) {
logger.debug("\(message, privacy: .public)")
}
static func warning(_ logger: Logger, _ message: String) {
logger.warning("\(message, privacy: .public)")
}
static func error(_ logger: Logger, _ message: String) {
logger.error("\(message, privacy: .public)")
}
static func error(_ logger: Logger, _ message: String, error: Error) {
logger.error("\(message, privacy: .public) | \(describe(error), privacy: .public)")
}
static func describe(_ error: Error) -> String {
if let apiError = error as? APIError {
return apiError.localizedDescription
}
if let decodingError = error as? DecodingError {
return describe(decodingError)
}
let nsError = error as NSError
return "\(nsError.domain) code=\(nsError.code) \(nsError.localizedDescription)"
}
static func describe(_ decodingError: DecodingError) -> String {
switch decodingError {
case let .typeMismatch(type, context):
return "Type mismatch for \(type): \(context.debugDescription) at \(codingPath(context.codingPath))"
case let .valueNotFound(type, context):
return "Value not found for \(type): \(context.debugDescription) at \(codingPath(context.codingPath))"
case let .keyNotFound(key, context):
return "Key \(key.stringValue) not found: \(context.debugDescription) at \(codingPath(context.codingPath))"
case let .dataCorrupted(context):
return "Data corrupted: \(context.debugDescription) at \(codingPath(context.codingPath))"
@unknown default:
return "Unknown decoding error"
}
}
private static func codingPath(_ path: [CodingKey]) -> String {
if path.isEmpty {
return "<root>"
}
return path.map(\.stringValue).joined(separator: ".")
}
}