Files
swiftpm-embedder/Plugins/Embedder/EmbedderPlugin.swift
T. R. Bernstein 292a2c859b Scaffold v1.0.0
2026-04-17 01:08:29 +02:00

70 lines
2.2 KiB
Swift

import Foundation
import PackagePlugin
@main
struct EmbedderPlugin: BuildToolPlugin {
func createBuildCommands(
context: PluginContext,
target: Target
) async throws -> [Command] {
guard let sourceModule = target as? SourceModuleTarget else {
return []
}
return try buildCommands(for: sourceModule, in: context)
}
}
private extension EmbedderPlugin {
static let staticInlineDirectoryName = "Static Inline"
static let generatedFileName = "Embedded.swift"
static let toolName = "EmbedderTool"
func buildCommands(
for target: SourceModuleTarget,
in context: PluginContext
) throws -> [Command] {
guard let staticInlineDirectory = locateStaticInlineDirectory(in: target) else {
return []
}
let inputFiles = try collectInputFiles(under: staticInlineDirectory)
guard !inputFiles.isEmpty else {
return []
}
return [
try makeBuildCommand(
sourceDirectory: staticInlineDirectory,
inputFiles: inputFiles,
context: context
)
]
}
func locateStaticInlineDirectory(in target: SourceModuleTarget) -> URL? {
let candidate = target.directoryURL.appending(path: Self.staticInlineDirectoryName)
return FileSystem.isDirectory(at: candidate) ? candidate : nil
}
func collectInputFiles(under directory: URL) throws -> [URL] {
try FileSystem.regularFiles(under: directory)
}
func makeBuildCommand(
sourceDirectory: URL,
inputFiles: [URL],
context: PluginContext
) throws -> Command {
let tool = try context.tool(named: Self.toolName)
let outputFile = context.pluginWorkDirectoryURL.appending(path: Self.generatedFileName)
return .buildCommand(
displayName: "Embedding files from \(Self.staticInlineDirectoryName)",
executable: tool.url,
arguments: [
sourceDirectory.path(percentEncoded: false),
outputFile.path(percentEncoded: false)
],
inputFiles: inputFiles,
outputFiles: [outputFile]
)
}
}