1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
/*
This source file is part of the Swift.org open source project
Copyright (c) 2021-2024 Apple Inc. and the Swift project authors
Licensed under Apache License v2.0 with Runtime Library Exception
See https://swift.org/LICENSE.txt for license information
See https://swift.org/CONTRIBUTORS.txt for Swift project authors
*/
import Foundation
import SwiftDocC
/// An action that creates an index of a documentation bundle.
public struct IndexAction: AsyncAction {
let rootURL: URL
let outputURL: URL
let bundleIdentifier: String
var diagnosticEngine: DiagnosticEngine
/// Initializes the action with the given validated options, creates or uses the given action workspace & context.
public init(documentationBundleURL: URL, outputURL: URL, bundleIdentifier: String, diagnosticEngine: DiagnosticEngine = .init()) throws {
// Initialize the action context.
self.rootURL = documentationBundleURL
self.outputURL = outputURL
self.bundleIdentifier = bundleIdentifier
self.diagnosticEngine = diagnosticEngine
self.diagnosticEngine.add(DiagnosticConsoleWriter(formattingOptions: [], baseURL: documentationBundleURL))
}
/// Converts each eligible file from the source documentation bundle,
/// saves the results in the given output alongside the template files.
public func perform(logHandle: inout LogHandle) async throws -> ActionResult {
let problems = try buildIndex()
diagnosticEngine.emit(problems)
return ActionResult(didEncounterError: !diagnosticEngine.problems.isEmpty, outputs: [outputURL])
}
private func buildIndex() throws -> [Problem] {
let dataProvider = try LocalFileSystemDataProvider(rootURL: rootURL)
let indexBuilder = NavigatorIndex.Builder(renderNodeProvider: FileSystemRenderNodeProvider(fileSystemProvider: dataProvider),
outputURL: outputURL,
bundleIdentifier: bundleIdentifier,
sortRootChildrenByName: true,
groupByLanguage: true)
return indexBuilder.build()
}
}
|