in Plugins/Swift-DocC Convert/SwiftDocCConvert.swift [14:76]
func performCommand(
context: PluginContext,
targets: [Target],
arguments: [String]
) throws {
// We'll be creating commands that invoke `docc`, so start by locating it.
let doccExecutableURL = try context.doccExecutable
// Parse the given command-line arguments
let parsedArguments = ParsedArguments(arguments)
// If the `--help` or `-h` flag was passed, print the plugin's help information
// and exit.
guard !parsedArguments.help else {
let helpInformation = try HelpInformation.forAction(
.convert,
doccExecutableURL: doccExecutableURL
)
print(helpInformation)
return
}
// Iterate over the Swift source module targets we were given.
try targets.lazy.compactMap(\.asSwiftSourceModuleTarget).forEach { target in
// Ask SwiftPM to generate or update symbol graph files for the target.
let symbolGraphDirectoryPath = try packageManager.getSymbolGraph(
for: target,
options: target.defaultSymbolGraphOptions(in: context.package)
).directoryPath.string
// Construct the output path for the generated DocC archive
let doccArchiveOutputPath = target.doccArchiveOutputPath(in: context)
// Use the parsed arguments gathered earlier to generate the necessary
// arguments to pass to `docc`. ParsedArguments will merge the flags provided
// by the user with default fallback values for required flags that were not
// provided.
let doccArguments = parsedArguments.doccArguments(
action: .convert,
targetKind: target.representsExecutable(in: context.package) ? .executable : .library,
doccCatalogPath: target.doccCatalogPath,
targetName: target.name,
symbolGraphDirectoryPath: symbolGraphDirectoryPath,
outputPath: doccArchiveOutputPath
)
// Run `docc convert` with the generated arguments and wait until the process completes
let process = try Process.run(doccExecutableURL, arguments: doccArguments)
process.waitUntilExit()
// Check whether the `docc convert` invocation was successful.
if process.terminationReason == .exit && process.terminationStatus == 0 {
let describedOutputPath = doccArguments.outputPath ?? "unknown location"
print("Generated DocC archive at '\(describedOutputPath)'.")
} else {
Diagnostics.error("""
'docc convert' invocation failed with a nonzero exit code: '\(process.terminationStatus)'.
"""
)
}
}
}