in codegen/sdk-codegen/build.gradle.kts [122:163]
fun discoverServices(): List<AwsService> {
val modelsDirProp: String by project
val modelsDir = project.file(modelsDirProp)
val models = fileTree(modelsDir).filter { it.isFile }.files.toMutableSet()
val onlyIncludeModels = getProperty("onlyIncludeModels")
val excludeModels = getProperty("excludeModels")
var filteredModels = models
onlyIncludeModels?.let {
val modelsToInclude = it.split(",").map { "$it.json" }.map { it.trim() }
filteredModels = models.filter { modelsToInclude.contains(it.name) }.toMutableSet()
}
// If a model is specified in both onlyIncludeModels and excludeModels, it is excluded.
excludeModels?.let {
val modelsToExclude = it.split(",").map { "$it.json" }.map { it.trim() }
filteredModels = filteredModels.filterNot { modelsToExclude.contains(it.name) }.toMutableSet()
}
return filteredModels
.map { file ->
val model = Model.assembler().addImport(file.absolutePath).assemble().result.get()
val services: List<ServiceShape> = model.shapes(ServiceShape::class.java).sorted().toList()
require(services.size == 1) { "Expected one service per aws model, but found ${services.size} in ${file.absolutePath}: ${services.map { it.id }}" }
val service = services.first()
file to service
}.map{ (file, service) ->
val serviceApi = service.getTrait(software.amazon.smithy.aws.traits.ServiceTrait::class.java).orNull()
?: error { "Expected aws.api#service trait attached to model ${file.absolutePath}" }
val (name, version, _) = file.name.split(".")
logger.info("discovered service: ${serviceApi.sdkId}")
AwsService(
name = service.id.toString(),
packageName = "AWS${serviceApi.sdkId.filterNot { it.isWhitespace() }.capitalize()}",
packageVersion = "1.0",
modelFile = file,
projectionName = name + "." + version.toLowerCase(),
sdkId = serviceApi.sdkId,
gitRepo = "https://github.com/aws-amplify/aws-sdk-swift.git")
}
}