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 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
/*
* Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://aws.amazon.com/apache2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
import software.amazon.smithy.model.Model
import software.amazon.smithy.model.node.Node
import software.amazon.smithy.model.shapes.ServiceShape
import software.amazon.smithy.gradle.tasks.SmithyBuild
import software.amazon.smithy.aws.traits.ServiceTrait
val smithyVersion: String by project
buildscript {
val smithyVersion: String by project
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
"classpath"("software.amazon.smithy:smithy-cli:$smithyVersion")
"classpath"("software.amazon.smithy:smithy-aws-traits:$smithyVersion")
}
}
plugins {
val smithyGradleVersion: String by project
id("software.amazon.smithy") version smithyGradleVersion
}
dependencies {
implementation(project(":smithy-aws-go-codegen"))
}
// This project doesn't produce a JAR.
tasks["jar"].enabled = false
// Run the SmithyBuild task manually since this project needs the built JAR
// from smithy-aws-typescript-codegen.
tasks["smithyBuildJar"].enabled = false
tasks.create<SmithyBuild>("buildSdk") {
addRuntimeClasspath = true
}
// Generates a smithy-build.json file by creating a new projection for every
// JSON file found in aws-models/. The generated smithy-build.json file is
// not committed to git since it's rebuilt each time codegen is performed.
tasks.register("generate-smithy-build") {
doLast {
val projectionsBuilder = Node.objectNodeBuilder()
val modelsDirProp: String by project
val models = project.file(modelsDirProp);
fileTree(models).filter { it.isFile }.files.forEach eachFile@{ file ->
val model = Model.assembler()
.addImport(file.absolutePath)
// Grab the result directly rather than worrying about checking for errors via unwrap.
// All we care about here is the service shape, any unchecked errors will be exposed
// as part of the actual build task done by the smithy gradle plugin.
.assemble().result.get();
val services = model.shapes(ServiceShape::class.javaObjectType).sorted().toList();
if (services.size != 1) {
throw Exception("There must be exactly one service in each aws model file, but found " +
"${services.size} in ${file.name}: ${services.map { it.id }}");
}
val service = services[0]
var filteredServices: String = System.getenv("SMITHY_GO_BUILD_API")?: ""
if (filteredServices.isNotEmpty()) {
for (filteredService in filteredServices.split(",")) {
if (!service.id.toString().startsWith(filteredService)) {
return@eachFile
}
}
}
val serviceTrait = service.getTrait(ServiceTrait::class.javaObjectType).get();
val sdkId = serviceTrait.sdkId
.replace("-", "")
.replace(" ", "")
.toLowerCase();
val projectionContents = Node.objectNodeBuilder()
.withMember("imports", Node.fromStrings("${models.absolutePath}${File.separator}${file.name}"))
.withMember("plugins", Node.objectNode()
.withMember("go-codegen", Node.objectNodeBuilder()
.withMember("service", service.id.toString())
.withMember("module", "github.com/aws/aws-sdk-go-v2/service/$sdkId")
.build()))
.build()
projectionsBuilder.withMember(sdkId + "." + service.version.toLowerCase(), projectionContents)
}
file("smithy-build.json").writeText(Node.prettyPrintJson(Node.objectNodeBuilder()
.withMember("version", "1.0")
.withMember("projections", projectionsBuilder.build())
.build()))
}
}
// Run the `buildSdk` automatically.
tasks["build"]
.dependsOn(tasks["generate-smithy-build"])
.finalizedBy(tasks["buildSdk"])
// ensure built artifacts are put into the SDK's folders
tasks.create<Exec>("copyGoCodegen") {
dependsOn ("buildSdk")
commandLine ("$rootDir/copy_go_codegen.sh", "$rootDir/..", (tasks["buildSdk"] as SmithyBuild).outputDirectory.absolutePath)
}
tasks["buildSdk"].finalizedBy(tasks["copyGoCodegen"])
|