blob: ba04552cdac4a32e082592b7858800286fb46970 [file] [log] [blame]
// Copyright 2016 The Tulsi Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
import Foundation
/// Sent when message information should be displayed to the user and/or sent to the system log.
/// The userInfo dictionary contains:
/// "level": String - The level of the message (see TulsiMessageLevel)
/// "message": String - The body of the message.
/// "details": String? - Optional detailed information about the message.
/// "context": String? - Optional contextual information about the message.
public let TulsiMessageNotification = "com.google.tulsi.Message"
/// Message levels used by TulsiMessage notifications.
public enum TulsiMessageLevel: String {
case Error, Warning, Syslog, Info, Debug
}
/// Message levels used for identifying priority and ordering in UI. @objc to use from a Storyboard.
@objc
public enum LogMessagePriority: Int {
case error, warning, syslog, info, debug
}
extension TulsiMessageLevel {
public var logRank: LogMessagePriority {
switch self {
case .Error:
return .error
case .Warning:
return .warning
case .Syslog:
return .syslog
case .Info:
return .info
case .Debug:
return .debug
}
}
}
public struct LogMessage {
public let level: TulsiMessageLevel
public let message: String
public let details: String?
public let context: String?
// Sends a notification to display any errors that have been logged with postError.
public static func displayPendingErrors() {
let userInfo = [ "displayErrors" : true ]
NotificationCenter.default.post(name: Notification.Name(rawValue: TulsiMessageNotification),
object: nil,
userInfo: userInfo)
}
// Sends a notification to log an error and adds it to a list of errors that can be displayed
// through the UI. Note that the errors are only displayed through the UI when
// displayPendingErrors() is called.
public static func postError(_ message: String, details: String? = nil, context: String? = nil) {
postMessage(.Error, message: message, details: details, context: context)
}
public static func postWarning(_ message: String, details: String? = nil, context: String? = nil) {
postMessage(.Warning, message: message, details: details, context: context)
}
public static func postInfo(_ message: String, details: String? = nil, context: String? = nil) {
postMessage(.Info, message: message, details: details, context: context)
}
public static func postSyslog(_ message: String, details: String? = nil, context: String? = nil) {
postMessage(.Syslog, message: message, details: details, context: context)
}
public static func postDebug(_ message: String, details: String? = nil, context: String? = nil) {
postMessage(.Debug, message: message, details: details, context: context)
}
/// Convenience method to post a notification that may be converted into a TulsiMessageItem.
private static func postMessage(_ level: TulsiMessageLevel,
message: String,
details: String? = nil,
context: String? = nil) {
var userInfo = [
"level": level.rawValue,
"message": message,
]
if let details = details {
userInfo["details"] = details
}
if let context = context {
userInfo["context"] = context
}
NotificationCenter.default.post(name: Notification.Name(rawValue: TulsiMessageNotification),
object: nil,
userInfo: userInfo)
}
public init?(notification: Notification) {
guard notification.name.rawValue == TulsiMessageNotification,
let userInfo = notification.userInfo,
let levelString = userInfo["level"] as? String,
let message = userInfo["message"] as? String,
let level = TulsiMessageLevel(rawValue: levelString) else {
return nil
}
self.level = level
self.message = message
self.details = userInfo["details"] as? String
self.context = userInfo["context"] as? String
}
}
/// Sent when the Tulsi generator initiates a task whose progress may be tracked.
/// The userInfo dictionary contains:
/// "name": String - The name of the task.
/// "maxValue": Int - The maximum value of the task
/// "progressNotificationName" - The name of the notification that will be sent when progress
/// changes.
/// "startIndeterminate" - Whether or not there might be an indeterminate delay before the first
/// update (for instance if a long initialization is required before actual work is begun).
public let ProgressUpdatingTaskDidStart = "com.google.tulsi.progressUpdatingTaskDidStart"
public let ProgressUpdatingTaskName = "name"
public let ProgressUpdatingTaskMaxValue = "maxValue"
public let ProgressUpdatingTaskStartIndeterminate = "startIndeterminate"
/// Sent when a task's progress changes.
/// The userInfo dictionary contains "value": Int - the new progress
public let ProgressUpdatingTaskProgress = "com.google.tulsi.progressUpdatingTaskProgress"
public let ProgressUpdatingTaskProgressValue = "value"
/// Sent when building source/setting groupings for indexer libraries.
public let GatheringIndexerSources = "gatheringIndexerSources"
/// Sent when creating Xcode build targets.
public let GeneratingBuildTargets = "generatingBuildTargets"
/// Sent when creating Xcode indexer targets.
public let GeneratingIndexerTargets = "generatingIndexerTargets"
/// Sent when copying the build scripts into the output Xcode project.
public let InstallingScripts = "installingScripts"
/// Sent when copying the build utilities into the output Xcode project.
public let InstallingUtilities = "installingUtilities"
/// Sent when copying the generator config into the output Xcode project.
public let InstallingGeneratorConfig = "installingGeneratorConfig"
/// Sent when starting to serialize the Xcode project.
public let SerializingXcodeProject = "serializingXcodeProject"
/// Sent when extracting source files from Bazel rules.
public let SourceFileExtraction = "sourceFileExtraction"
/// Sent when extracting workspace information.
public let WorkspaceInfoExtraction = "workspaceInfoExtraction"