Skip to content

Commit 571c78d

Browse files
authored
feat: Add Swift Package Registry tools and config (#771)
1 parent 9e3ea22 commit 571c78d

File tree

5 files changed

+169
-80
lines changed

5 files changed

+169
-80
lines changed

smithy-swift-codegen/src/main/kotlin/software/amazon/smithy/swift/codegen/PackageManifestGenerator.kt

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,15 @@ package software.amazon.smithy.swift.codegen
66

77
import software.amazon.smithy.codegen.core.SymbolDependency
88
import software.amazon.smithy.swift.codegen.integration.ProtocolGenerator
9+
import kotlin.jvm.optionals.getOrNull
10+
11+
val PACKAGE_MANIFEST_NAME = "Package.swift.txt"
912

1013
class PackageManifestGenerator(val ctx: ProtocolGenerator.GenerationContext) {
1114

1215
fun writePackageManifest(dependencies: List<SymbolDependency>) {
13-
ctx.delegator.useFileWriter("Package.swift") { writer ->
14-
writer.write("// swift-tools-version:\$L", ctx.settings.swiftVersion)
16+
ctx.delegator.useFileWriter(PACKAGE_MANIFEST_NAME) { writer ->
17+
writer.write("// swift-tools-version: \$L", ctx.settings.swiftVersion)
1518
writer.write("")
1619
writer.write("import PackageDescription")
1720
writer.write("")
@@ -27,49 +30,64 @@ class PackageManifestGenerator(val ctx: ProtocolGenerator.GenerationContext) {
2730
writer.write(".library(name: \$S, targets: [\$S])", ctx.settings.moduleName, ctx.settings.moduleName)
2831
}
2932

30-
val externalDependencies = dependencies.filter { it.getProperty("url", String::class.java).get().isNotEmpty() }
31-
val dependenciesByURL = externalDependencies.distinctBy { it.expectProperty("url", String::class.java) }
33+
val externalDependencies = dependencies.filter {
34+
it.getProperty("url", String::class.java).getOrNull() != null ||
35+
it.getProperty("scope", String::class.java).getOrNull() != null
36+
}
37+
val dependenciesByURL = externalDependencies.distinctBy {
38+
it.getProperty("url", String::class.java).getOrNull()
39+
?: "${it.getProperty("scope", String::class.java).get()}.${it.packageName}"
40+
}
3241

3342
writer.openBlock("dependencies: [", "],") {
34-
dependenciesByURL.forEach { dependency ->
35-
writer.openBlock(".package(", "),") {
36-
37-
val localPath = dependency.expectProperty("localPath", String::class.java)
38-
if (localPath.isNotEmpty()) {
39-
writer.write("path: \$S", localPath)
40-
} else {
41-
val dependencyURL = dependency.expectProperty("url", String::class.java)
42-
writer.write("url: \$S,", dependencyURL)
43-
writer.write("from: \$S", dependency.version)
44-
}
45-
}
46-
}
43+
dependenciesByURL.forEach { writePackageDependency(writer, it) }
4744
}
4845

4946
val dependenciesByTarget = externalDependencies.distinctBy { it.expectProperty("target", String::class.java) + it.packageName }
5047

5148
writer.openBlock("targets: [", "]") {
5249
writer.openBlock(".target(", "),") {
5350
writer.write("name: \$S,", ctx.settings.moduleName)
54-
writer.openBlock("dependencies: [", "]") {
55-
for (dependency in dependenciesByTarget) {
56-
writer.openBlock(".product(", "),") {
57-
val target = dependency.expectProperty("target", String::class.java)
58-
writer.write("name: \$S,", target)
59-
writer.write("package: \$S", dependency.packageName)
60-
}
61-
}
51+
writer.openBlock("dependencies: [", "],") {
52+
dependenciesByTarget.forEach { writeTargetDependency(writer, it) }
53+
}
54+
writer.openBlock("resources: [", "]") {
55+
writer.write(".process(\"Resources\")")
6256
}
6357
}
6458
writer.openBlock(".testTarget(", ")") {
6559
writer.write("name: \$S,", ctx.settings.testModuleName)
6660
writer.openBlock("dependencies: [", "]") {
6761
writer.write("\$S,", ctx.settings.moduleName)
68-
writer.write(".product(name: \"SmithyTestUtil\", package: \"smithy-swift\"),")
62+
SwiftDependency.SMITHY_TEST_UTIL.dependencies.forEach { writeTargetDependency(writer, it) }
6963
}
7064
}
7165
}
7266
}
7367
}
7468
}
69+
70+
private fun writePackageDependency(writer: SwiftWriter, dependency: SymbolDependency) {
71+
writer.openBlock(".package(", "),") {
72+
val scope = dependency.getProperty("scope", String::class.java).getOrNull()
73+
scope?.let {
74+
writer.write("id: \$S,", "$it.${dependency.packageName}")
75+
}
76+
val url = dependency.getProperty("url", String::class.java).getOrNull()
77+
url?.let {
78+
writer.write("url: \$S,", it)
79+
}
80+
writer.write("from: \$S", dependency.version)
81+
}
82+
}
83+
84+
private fun writeTargetDependency(writer: SwiftWriter, dependency: SymbolDependency) {
85+
writer.openBlock(".product(", "),") {
86+
val target = dependency.expectProperty("target", String::class.java)
87+
writer.write("name: \$S,", target)
88+
val scope = dependency.getProperty("scope", String::class.java).getOrNull()
89+
val packageName = scope?.let { "$it.${dependency.packageName}" } ?: dependency.packageName
90+
writer.write("package: \$S", packageName)
91+
}
92+
}
7593
}

0 commit comments

Comments
 (0)