/* * 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 kotlin.streams.toList plugins { id("software.amazon.smithy") version "0.5.1" } 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("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 } } } var (sdkId, version, remaining) = file.name.split(".") sdkId = sdkId.replace("-", "").toLowerCase(); val projectionContents = Node.objectNodeBuilder() .withMember("imports", Node.fromStrings("${models.getAbsolutePath()}${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.toLowerCase()) .withMember("moduleVersion", "1.0") .build())) .build() projectionsBuilder.withMember(sdkId + "." + 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("copyGoCodegen") { dependsOn ("buildSdk") commandLine ("$rootDir/copy_go_codegen.sh", "$rootDir/../", "$buildDir", "github.com/aws/aws-sdk-go-v2/") } tasks["buildSdk"].finalizedBy(tasks["copyGoCodegen"])