blob: be9fded5f7806fd26a1ba243c3ee24c25cbfa63f [file] [log] [blame]
// Copyright 2017 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
/// A Bazel Build Event parsed from its JSON representation. Currently this is only used for seeing
/// what files are generated.
class BazelBuildEvent {
let files: [String]
init(eventDictionary: [String: AnyObject]) {
var files = [String]()
if let namedSetOfFiles = eventDictionary["namedSetOfFiles"] as? [String: AnyObject],
let fileDicts = namedSetOfFiles["files"] as? [[String: AnyObject]] {
for fileDict in fileDicts {
guard let uri = fileDict["uri"] as? String else { continue }
// File URIs have a 'file://' prefix, so remove if present.
if uri.hasPrefix("file://") {
let index = uri.index(uri.startIndex, offsetBy: 7)
files.append(String(uri[index...]))
}
}
}
self.files = files
}
}
class BazelBuildEventsReader {
private let filePath: String
private let localizedMessageLogger: LocalizedMessageLogger
init(filePath: String, localizedMessageLogger: LocalizedMessageLogger) {
self.filePath = filePath
self.localizedMessageLogger = localizedMessageLogger
}
func readAllEvents() throws -> [BazelBuildEvent] {
let string = try String(contentsOfFile: filePath, encoding: .utf8)
var newEvents = [BazelBuildEvent]()
string.enumerateLines { line, _ in
guard let event = self.parseBuildEventFromLine(line) else { return }
newEvents.append(event)
}
return newEvents
}
func parseBuildEventFromLine(_ line: String) -> BazelBuildEvent? {
guard let data = line.data(using: .utf8) else {
localizedMessageLogger.warning("BazelParseBuildEventFailed",
comment: "Error to show when unable to parse a Bazel Build Event JSON dictionary. Additional information: %1$@.",
values:"Failed to convert string to UTF-8")
return nil
}
do {
guard let json = try JSONSerialization.jsonObject(with: data,
options: JSONSerialization.ReadingOptions())
as? [String: AnyObject] else {
localizedMessageLogger.warning("BazelParseBuildEventFailed",
comment: "Error to show when unable to parse a Bazel Build Event JSON dictionary. Additional information: %1$@.",
values:"Failed to parse event JSON from string: " + line)
return nil
}
return BazelBuildEvent(eventDictionary: json)
} catch let e as NSError {
localizedMessageLogger.warning("BazelParseBuildEventFailed",
comment: "Error to show when unable to parse a Bazel Build Event JSON dictionary. Additional information: %1$@.",
values:"Error when parsing JSON: " + e.localizedDescription)
return nil
} catch {
localizedMessageLogger.warning("BazelParseBuildEventFailed",
comment: "Error to show when unable to parse a Bazel Build Event JSON dictionary. Additional information: %1$@.",
values:"Unknown error when parsing JSON from string: " + line)
return nil
}
}
}