fun discoverServices()

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")
        }
}