Skip to content

Commit 0e8da6e

Browse files
p4checotboogh
andauthored
Add XcodePlugin support (#1)
Co-authored-by: Tobias Boogh <[email protected]>
1 parent 879b85a commit 0e8da6e

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

Plugins/SwiftGenPlugin/Plugin.swift

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,33 @@ struct SwiftGenPlugin: BuildToolPlugin {
3131
}
3232
}
3333

34+
#if canImport(XcodeProjectPlugin)
35+
import XcodeProjectPlugin
36+
37+
extension SwiftGenPlugin: XcodeBuildToolPlugin {
38+
func createBuildCommands(context: XcodePluginContext, target: XcodeTarget) throws -> [Command] {
39+
let fileManager = FileManager.default
40+
41+
// Possible paths where there may be a config file (root of package, target dir.)
42+
let configurations: [Path] = [context.xcodeProject.directory]
43+
.map { $0.appending("swiftgen.yml") }
44+
.filter { fileManager.fileExists(atPath: $0.string) }
45+
46+
// Validate paths list
47+
guard validate(configurations: configurations, target: target) else {
48+
return []
49+
}
50+
51+
// Clear the SwiftGen plugin's directory (in case of dangling files)
52+
fileManager.forceClean(directory: context.pluginWorkDirectory)
53+
54+
return try configurations.map { configuration in
55+
try .swiftgen(using: configuration, context: context, target: target)
56+
}
57+
}
58+
}
59+
#endif
60+
3461
// MARK: - Helpers
3562

3663
private extension SwiftGenPlugin {
@@ -47,6 +74,21 @@ private extension SwiftGenPlugin {
4774

4875
return true
4976
}
77+
78+
#if canImport(XcodeProjectPlugin)
79+
func validate(configurations: [Path], target: XcodeTarget) -> Bool {
80+
guard !configurations.isEmpty else {
81+
Diagnostics.error("""
82+
No SwiftGen configurations found for target \(target.displayName). If you would like to generate sources for this \
83+
target include a `swiftgen.yml` in the target's source directory, or include a shared `swiftgen.yml` at the \
84+
package's root.
85+
""")
86+
return false
87+
}
88+
89+
return true
90+
}
91+
#endif
5092
}
5193

5294
private extension Command {
@@ -69,6 +111,27 @@ private extension Command {
69111
outputFilesDirectory: context.pluginWorkDirectory
70112
)
71113
}
114+
115+
#if canImport(XcodeProjectPlugin)
116+
static func swiftgen(using configuration: Path, context: XcodePluginContext, target: XcodeTarget) throws -> Command {
117+
.prebuildCommand(
118+
displayName: "SwiftGen BuildTool Plugin",
119+
executable: try context.tool(named: "swiftgen").path,
120+
arguments: [
121+
"config",
122+
"run",
123+
"--verbose",
124+
"--config", "\(configuration)"
125+
],
126+
environment: [
127+
"PROJECT_DIR": context.xcodeProject.directory,
128+
"TARGET_NAME": target.displayName,
129+
"DERIVED_SOURCES_DIR": context.pluginWorkDirectory
130+
],
131+
outputFilesDirectory: context.pluginWorkDirectory
132+
)
133+
}
134+
#endif
72135
}
73136

74137
private extension FileManager {

0 commit comments

Comments
 (0)