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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
/*
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
/**
This class provides a simple way to transform a `FileSystemProvider` into a `RenderNodeProvider` to feed an index builder.
The data from the disk is fetched and processed in an efficient way to build a navigator index.
*/
public class FileSystemRenderNodeProvider: RenderNodeProvider {
/// The internal `FileSystemProvider` reference.
private let dataProvider: FileSystemProvider
/// The list of problems the provider encountered during the process.
private var problems = [Problem]()
/// The enqueued file system nodes.
private var queue = [FSNode]()
/**
Initialize an instance to provide `RenderNode` instances from a give `FileSystemProvider`.
*/
public init(fileSystemProvider: FileSystemProvider) {
dataProvider = fileSystemProvider
// Insert the first node in the queue
queue.append(fileSystemProvider.fileSystem)
}
/// Returns a render node that can be processed by an index creator, for example.
public func getRenderNode() -> RenderNode? {
var renderNode: RenderNode? = nil
while let next = queue.first, renderNode == nil {
switch next {
case .directory(let dir):
queue.append(contentsOf: dir.children)
case .file(let file):
// we need to process JSON files only
if file.url.pathExtension.lowercased() == "json" {
do {
let data = try Data(contentsOf: file.url)
renderNode = try RenderNode.decode(fromJSON: data)
} catch {
let diagnostic = Diagnostic(source: file.url,
severity: .warning,
range: nil,
identifier: "org.swift.docc",
summary: "Invalid file found while indexing content: \(error.localizedDescription)")
let problem = Problem(diagnostic: diagnostic, possibleSolutions: [])
problems.append(problem)
}
}
}
queue.removeFirst()
}
return renderNode
}
/// Get the problems that happened during the process.
/// - Returns: An array with the problems encountered during the filesystem read of render nodes.
public func getProblems() -> [Problem] {
return problems
}
}
extension RenderNode {
/// Returns the NavigatorIndex.PageType indicating the type of the page.
@_disfavoredOverload
@available(*, deprecated, message: "This deprecated API will be removed after 6.1 is released")
public func navigatorPageType() -> NavigatorIndex.PageType {
return (self as any NavigatorIndexableRenderNodeRepresentation).navigatorPageType()
}
}
|