/
GenerateManualPlugin.swift
95 lines (80 loc) · 3.26 KB
/
GenerateManualPlugin.swift
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
85
86
87
88
89
90
91
92
93
94
95
//===----------------------------------------------------------*- swift -*-===//
//
// This source file is part of the Swift Argument Parser open source project
//
// Copyright (c) 2021 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
//
//===----------------------------------------------------------------------===//
import PackagePlugin
import Foundation
@main
struct GenerateManualPlugin: CommandPlugin {
func performCommand(
context: PluginContext,
arguments: [String]
) async throws {
// Locate generation tool.
let generationToolFile = try context.tool(named: "generate-manual").path
// Create an extractor to extract plugin-only arguments from the `arguments`
// array.
var extractor = ArgumentExtractor(arguments)
// Run generation tool once if help is requested.
if extractor.helpRequest() {
try generationToolFile.exec(arguments: ["--help"])
print("""
ADDITIONAL OPTIONS:
--configuration <configuration>
Tool build configuration used to generate the
manual. (default: release)
NOTE: The "GenerateManual" plugin handles passing the "<tool>" and
"--output-directory <output-directory>" arguments. Manually supplying
these arguments will result in a runtime failure.
""")
return
}
// Extract configuration argument before making it to the
// "generate-manual" tool.
let configuration = try extractor.configuration()
// Build all products first.
print("Building package in \(configuration) mode...")
let buildResult = try packageManager.build(
.all(includingTests: false),
parameters: .init(configuration: configuration))
guard buildResult.succeeded else {
throw GenerateManualPluginError.buildFailed(buildResult.logText)
}
print("Built package in \(configuration) mode")
// Run generate-manual on all executable artifacts.
for builtArtifact in buildResult.builtArtifacts {
// Skip non-executable targets
guard builtArtifact.kind == .executable else { continue }
// Skip executables without a matching product.
guard let product = builtArtifact.matchingProduct(context: context)
else { continue }
// Skip products without a dependency on ArgumentParser.
guard product.hasDependency(named: "ArgumentParser") else { continue }
// Get the artifacts name.
let executableName = builtArtifact.path.lastComponent
print("Generating manual for \(executableName)...")
// Create output directory.
let outputDirectory = context
.pluginWorkDirectory
.appending(executableName)
try outputDirectory.createOutputDirectory()
// Create generation tool arguments.
var generationToolArguments = [
builtArtifact.path.string,
"--output-directory",
outputDirectory.string
]
generationToolArguments.append(
contentsOf: extractor.unextractedOptionsOrFlags)
// Spawn generation tool.
try generationToolFile.exec(arguments: generationToolArguments)
print("Generated manual in '\(outputDirectory)'")
}
}
}