Skip to content

Commit 8073026

Browse files
committed
Make logging a cross-cutting concern
1 parent daf5106 commit 8073026

File tree

11 files changed

+101
-57
lines changed

11 files changed

+101
-57
lines changed

ios/Demo-iOS/Sources/GutenbergApp.swift

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
11
import SwiftUI
2+
import OSLog
3+
import GutenbergKit
24

35
@main
46
struct GutenbergApp: App {
7+
init() {
8+
// Configure logger for GutenbergKit
9+
EditorLogger.shared = OSLogEditorLogger()
10+
EditorLogger.logLevel = .debug
11+
}
12+
513
var body: some Scene {
614
WindowGroup {
715
NavigationStack {
@@ -12,3 +20,20 @@ struct GutenbergApp: App {
1220
.environmentObject(AuthenticationManager())
1321
}
1422
}
23+
24+
struct OSLogEditorLogger: GutenbergKit.EditorLogging {
25+
private let logger: Logger
26+
27+
init(subsystem: String = "com.gutenbergkit.demo", category: String = "GutenbergKit") {
28+
self.logger = Logger(subsystem: subsystem, category: category)
29+
}
30+
31+
func log(_ level: GutenbergKit.EditorLogLevel, _ message: String) {
32+
switch level {
33+
case .debug: logger.debug("\(message)")
34+
case .info: logger.info("\(message)")
35+
case .warn: logger.warning("\(message)")
36+
case .error: logger.error("\(message)")
37+
}
38+
}
39+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import Foundation
2+
import OSLog
3+
import GutenbergKit
4+
5+
/// An OSLog-based implementation of EditorLogging.
6+
struct OSLogEditorLogger: EditorLogging {
7+
private let logger: Logger
8+
9+
init(subsystem: String = "com.gutenbergkit.demo", category: String = "GutenbergKit") {
10+
self.logger = Logger(subsystem: subsystem, category: category)
11+
}
12+
13+
func log(_ level: EditorLogLevel, _ message: String) {
14+
switch level {
15+
case .debug: logger.debug("\(message)")
16+
case .info: logger.info("\(message)")
17+
case .warn: logger.warning("\(message)")
18+
case .error: logger.error("\(message)")
19+
}
20+
}
21+
}

ios/Demo-iOS/Sources/Views/AppRootView.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ struct AppRootView: View {
8383
.setSiteApiRoot(config.siteApiRoot)
8484
.setAuthHeader(config.authHeader)
8585
.setNativeInserterEnabled(isNativeInserterEnabled)
86-
.setLogLevel(.debug)
8786
.build()
8887

8988
self.activeEditorConfiguration = updatedConfiguration

ios/Demo-iOS/Sources/Views/EditorView.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,6 @@ private struct _EditorView: UIViewControllerRepresentable {
159159
// No-op for demo
160160
}
161161

162-
func editor(_ viewController: EditorViewController, didLogMessage message: String, level: LogLevel) {
163-
print("[\(level)]: \(message)")
164-
}
165-
166162
func editor(_ viewController: EditorViewController, didLogException error: GutenbergJSException) {
167163
// No-op for demo
168164
}

ios/Sources/GutenbergKit/Sources/EditorConfiguration.swift

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ public struct EditorConfiguration: Sendable {
3030
public let locale: String
3131
/// Enables the native inserter UI in the editor
3232
public let isNativeInserterEnabled: Bool
33-
/// Logs emitted at or above this level will be printed to the debug console
34-
public let logLevel: LogLevel
3533

3634
/// Deliberately non-public – consumers should use `EditorConfigurationBuilder` to construct a configuration
3735
init(
@@ -48,8 +46,7 @@ public struct EditorConfiguration: Sendable {
4846
namespaceExcludedPaths: [String],
4947
authHeader: String,
5048
locale: String,
51-
isNativeInserterEnabled: Bool,
52-
logLevel: LogLevel
49+
isNativeInserterEnabled: Bool
5350
) {
5451
self.title = title
5552
self.content = content
@@ -65,7 +62,6 @@ public struct EditorConfiguration: Sendable {
6562
self.authHeader = authHeader
6663
self.locale = locale
6764
self.isNativeInserterEnabled = isNativeInserterEnabled
68-
self.logLevel = logLevel
6965
}
7066

7167
public func toBuilder() -> EditorConfigurationBuilder {
@@ -113,7 +109,6 @@ public struct EditorConfigurationBuilder {
113109
private var authHeader: String
114110
private var locale: String
115111
private var isNativeInserterEnabled: Bool
116-
private var logLevel: LogLevel
117112

118113
public init(
119114
title: String = "",
@@ -129,8 +124,7 @@ public struct EditorConfigurationBuilder {
129124
namespaceExcludedPaths: [String] = [],
130125
authHeader: String = "",
131126
locale: String = "en",
132-
isNativeInserterEnabled: Bool = false,
133-
logLevel: LogLevel = .error
127+
isNativeInserterEnabled: Bool = false
134128
){
135129
self.title = title
136130
self.content = content
@@ -146,7 +140,6 @@ public struct EditorConfigurationBuilder {
146140
self.authHeader = authHeader
147141
self.locale = locale
148142
self.isNativeInserterEnabled = isNativeInserterEnabled
149-
self.logLevel = logLevel
150143
}
151144

152145
public func setTitle(_ title: String) -> EditorConfigurationBuilder {
@@ -233,12 +226,6 @@ public struct EditorConfigurationBuilder {
233226
return copy
234227
}
235228

236-
public func setLogLevel(_ logLevel: LogLevel) -> EditorConfigurationBuilder {
237-
var copy = self
238-
copy.logLevel = logLevel
239-
return copy
240-
}
241-
242229
/// Simplify conditionally applying a configuration change
243230
///
244231
/// Sample Code:
@@ -276,8 +263,7 @@ public struct EditorConfigurationBuilder {
276263
namespaceExcludedPaths: namespaceExcludedPaths,
277264
authHeader: authHeader,
278265
locale: locale,
279-
isNativeInserterEnabled: isNativeInserterEnabled,
280-
logLevel: logLevel
266+
isNativeInserterEnabled: isNativeInserterEnabled
281267
)
282268
}
283269
}

ios/Sources/GutenbergKit/Sources/EditorJSMessage.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,6 @@ struct EditorJSMessage {
100100

101101
struct LogMessage: Decodable {
102102
let message: String
103-
let level: LogLevel
103+
let level: EditorLogLevel
104104
}
105105
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import Foundation
2+
3+
/// Protocol for logging editor-related messages.
4+
public protocol EditorLogging: Sendable {
5+
/// Logs a message at the specified level.
6+
func log(_ level: EditorLogLevel, _ message: String)
7+
}
8+
9+
/// Global logger for GutenbergKit.
10+
///
11+
/// - warning: The shared properties are nonisolated and should be set once
12+
/// during the program lifetime before other editor APIs are used.
13+
public enum EditorLogger {
14+
/// The shared logger instance used throughout GutenbergKit.
15+
public nonisolated(unsafe) static var shared: EditorLogging?
16+
17+
/// The log level. Messages below this level are ignored.
18+
public nonisolated(unsafe) static var logLevel: EditorLogLevel = .error
19+
}
20+
21+
func log(_ level: EditorLogLevel, _ message: @autoclosure () -> String) {
22+
guard level.priority >= EditorLogger.logLevel.priority,
23+
let logger = EditorLogger.shared else {
24+
return
25+
}
26+
logger.log(level, message())
27+
}
28+
29+
public enum EditorLogLevel: String, Decodable, Sendable {
30+
case error
31+
case warn
32+
case info
33+
case debug
34+
35+
public static let all: EditorLogLevel = .debug
36+
37+
public var priority: Int {
38+
switch self {
39+
case .error: return 3
40+
case .warn: return 2
41+
case .info: return 1
42+
case .debug: return 0
43+
}
44+
}
45+
}

ios/Sources/GutenbergKit/Sources/EditorViewController.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public final class EditorViewController: UIViewController, GutenbergEditorContro
157157
title: '\(configuration.escapedTitle)',
158158
content: '\(configuration.escapedContent)'
159159
},
160-
logLevel: '\(configuration.logLevel)',
160+
logLevel: '\(EditorLogger.logLevel.rawValue)',
161161
manifest: \(dependencies?.manifest ?? "undefined")
162162
};
163163
@@ -460,8 +460,8 @@ public final class EditorViewController: UIViewController, GutenbergEditorContro
460460
hideNavigationOverlay()
461461
delegate?.editor(self, didCloseModalDialog: body.dialogType)
462462
case .log:
463-
let log = try message.decode(EditorJSMessage.LogMessage.self)
464-
delegate?.editor(self, didLogMessage: log.message, level: log.level)
463+
let logMessage = try message.decode(EditorJSMessage.LogMessage.self)
464+
log(logMessage.level, logMessage.message)
465465
}
466466
} catch {
467467
fatalError("failed to decode message: \(error)")

ios/Sources/GutenbergKit/Sources/EditorViewControllerDelegate.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,6 @@ public protocol EditorViewControllerDelegate: AnyObject {
3535
/// Notifies the client about an exception that occurred during the editor
3636
func editor(_ viewController: EditorViewController, didLogException error: GutenbergJSException)
3737

38-
/// Notifies the client about a log message emitted by the editor
39-
func editor(_ viewController: EditorViewController, didLogMessage message: String, level: LogLevel)
40-
4138
func editor(_ viewController: EditorViewController, didRequestMediaFromSiteMediaLibrary config: OpenMediaLibraryAction)
4239

4340
/// Notifies the client that an autocompleter was triggered.

ios/Sources/GutenbergKit/Sources/LogLevel.swift

Lines changed: 0 additions & 8 deletions
This file was deleted.

0 commit comments

Comments
 (0)