Skip to content

Commit 21f1bd5

Browse files
authored
add DSL overloads, paginators, and better builder integration for DDB Mapper ops codegen (#1409)
1 parent 15a9472 commit 21f1bd5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1464
-573
lines changed

hll/build.gradle.kts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,16 @@ val sdkVersion: String by project
2525
// capture locally - scope issue with custom KMP plugin
2626
val libraries = libs
2727

28+
val optinAnnotations = listOf(
29+
"aws.smithy.kotlin.runtime.InternalApi",
30+
"aws.sdk.kotlin.runtime.InternalSdkApi",
31+
"kotlin.RequiresOptIn",
32+
)
33+
2834
subprojects {
29-
if (!needsKmpConfigured) return@subprojects
35+
if (!needsKmpConfigured) {
36+
return@subprojects
37+
}
3038

3139
group = "aws.sdk.kotlin"
3240
version = sdkVersion
@@ -45,6 +53,10 @@ subprojects {
4553
sourceSets {
4654
// dependencies available for all subprojects
4755

56+
all {
57+
optinAnnotations.forEach(languageSettings::optIn)
58+
}
59+
4860
named("commonTest") {
4961
dependencies {
5062
implementation(libraries.kotest.assertions.core)
@@ -60,12 +72,6 @@ subprojects {
6072
}
6173
}
6274

63-
kotlin.sourceSets.all {
64-
// Allow subprojects to use internal APIs
65-
// See https://kotlinlang.org/docs/reference/opt-in-requirements.html#opting-in-to-using-api
66-
listOf("kotlin.RequiresOptIn").forEach { languageSettings.optIn(it) }
67-
}
68-
6975
dependencies {
7076
dokkaPlugin(project(":dokka-aws"))
7177
}

hll/dynamodb-mapper/dynamodb-mapper-codegen/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,18 @@ dependencies {
2424
testImplementation(libs.kotlin.test.junit5)
2525
}
2626

27+
val optinAnnotations = listOf(
28+
"aws.smithy.kotlin.runtime.InternalApi",
29+
"aws.sdk.kotlin.runtime.InternalSdkApi",
30+
"kotlin.RequiresOptIn",
31+
)
32+
2733
kotlin {
2834
explicitApi()
35+
36+
sourceSets.all {
37+
optinAnnotations.forEach(languageSettings::optIn)
38+
}
2939
}
3040

3141
tasks.test {

hll/dynamodb-mapper/dynamodb-mapper-codegen/src/main/kotlin/aws/sdk/kotlin/hll/dynamodbmapper/codegen/annotations/AnnotationsProcessor.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package aws.sdk.kotlin.hll.dynamodbmapper.codegen.annotations
66

77
import aws.sdk.kotlin.hll.codegen.core.CodeGeneratorFactory
8+
import aws.sdk.kotlin.hll.codegen.ksp.processors.HllKspProcessor
89
import aws.sdk.kotlin.hll.codegen.rendering.RenderOptions.VisibilityAttribute
910
import aws.sdk.kotlin.hll.codegen.rendering.Visibility
1011
import aws.sdk.kotlin.hll.dynamodbmapper.DynamoDbItem
@@ -19,17 +20,11 @@ import com.google.devtools.ksp.validate
1920

2021
private val annotationName = DynamoDbItem::class.qualifiedName!!
2122

22-
public class AnnotationsProcessor(private val environment: SymbolProcessorEnvironment) : SymbolProcessor {
23-
private var invoked = false
23+
public class AnnotationsProcessor(private val environment: SymbolProcessorEnvironment) : HllKspProcessor(environment) {
2424
private val logger = environment.logger
2525
private val codeGenerator = environment.codeGenerator
2626

27-
override fun process(resolver: Resolver): List<KSAnnotated> {
28-
if (invoked) {
29-
return listOf()
30-
}
31-
invoked = true
32-
27+
override fun processImpl(resolver: Resolver): List<KSAnnotated> {
3328
logger.info("Searching for symbols annotated with $annotationName")
3429
val annotated = resolver.getSymbolsWithAnnotation(annotationName)
3530
val invalid = annotated.filterNot { it.validate() }.toList()

hll/dynamodb-mapper/dynamodb-mapper-codegen/src/main/kotlin/aws/sdk/kotlin/hll/dynamodbmapper/codegen/annotations/rendering/SchemaRenderer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ internal class SchemaRenderer(
9999

100100
private fun renderBuilder() {
101101
val members = properties.map(Member.Companion::from).toSet()
102-
BuilderRenderer(this, classType, members, ctx).render()
102+
BuilderRenderer(this, classType, classType, members, ctx).render()
103103
}
104104

105105
private fun renderItemConverter() {
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package aws.sdk.kotlin.hll.dynamodbmapper.codegen.model
6+
7+
import aws.sdk.kotlin.runtime.InternalSdkApi
8+
9+
@InternalSdkApi
10+
public object MapperPkg {
11+
@InternalSdkApi
12+
public object Hl {
13+
public val Base: String = "aws.sdk.kotlin.hll.dynamodbmapper"
14+
public val Annotations: String = "$Base.annotations"
15+
public val Items: String = "$Base.items"
16+
public val Model: String = "$Base.model"
17+
public val Ops: String = "$Base.operations"
18+
public val PipelineImpl: String = "$Base.pipeline.internal"
19+
public val Values: String = "$Base.values"
20+
public val CollectionValues: String = "$Values.collections"
21+
public val ScalarValues: String = "$Values.scalars"
22+
public val SmithyTypeValues: String = "$Values.smithytypes"
23+
}
24+
25+
@InternalSdkApi
26+
public object Ll {
27+
public val Base: String = "aws.sdk.kotlin.services.dynamodb"
28+
public val Model: String = "$Base.model"
29+
}
30+
}

hll/dynamodb-mapper/dynamodb-mapper-codegen/src/main/kotlin/aws/sdk/kotlin/hll/dynamodbmapper/codegen/model/MapperTypes.kt

Lines changed: 87 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -4,117 +4,129 @@ import aws.sdk.kotlin.hll.codegen.model.Type
44
import aws.sdk.kotlin.hll.codegen.model.TypeRef
55
import aws.sdk.kotlin.hll.codegen.model.TypeVar
66
import aws.sdk.kotlin.hll.codegen.model.Types
7-
import aws.sdk.kotlin.hll.codegen.util.Pkg
87

98
/**
109
* A container object for various DynamoDbMapper [Type] instances
1110
*/
1211
internal object MapperTypes {
1312
// Low-level types
14-
val AttributeValue = TypeRef(Pkg.Ll.Model, "AttributeValue")
13+
val AttributeValue = TypeRef(MapperPkg.Ll.Model, "AttributeValue")
1514
val AttributeMap = Types.Kotlin.map(Types.Kotlin.String, AttributeValue)
1615

1716
// High-level types
18-
val DynamoDbMapper = TypeRef(Pkg.Hl.Base, "DynamoDbMapper")
17+
val DynamoDbMapper = TypeRef(MapperPkg.Hl.Base, "DynamoDbMapper")
18+
19+
object Annotations {
20+
val ManualPagination = TypeRef(MapperPkg.Hl.Annotations, "ManualPagination")
21+
}
1922

2023
object Items {
21-
fun itemSchema(typeVar: String) = TypeRef(Pkg.Hl.Items, "ItemSchema", listOf(TypeVar(typeVar)))
22-
fun itemSchemaPartitionKey(objectType: TypeRef, pkType: TypeRef) = TypeRef(Pkg.Hl.Items, "ItemSchema.PartitionKey", listOf(objectType, pkType))
23-
fun itemSchemaCompositeKey(objectType: TypeRef, pkType: TypeRef, skType: TypeRef) = TypeRef(Pkg.Hl.Items, "ItemSchema.CompositeKey", listOf(objectType, pkType, skType))
24-
fun keySpec(keyType: TypeRef) = TypeRef(Pkg.Hl.Items, "KeySpec", genericArgs = listOf(keyType))
25-
val KeySpecNumber = TypeRef(Pkg.Hl.Items, "KeySpec.Number")
26-
val KeySpecString = TypeRef(Pkg.Hl.Items, "KeySpec.String")
27-
val KeySpecByteArray = TypeRef(Pkg.Hl.Items, "KeySpec.ByteArray")
28-
val AttributeDescriptor = TypeRef(Pkg.Hl.Items, "AttributeDescriptor")
29-
fun itemConverter(objectType: TypeRef) = TypeRef(Pkg.Hl.Items, "ItemConverter", genericArgs = listOf(objectType))
30-
val SimpleItemConverter = TypeRef(Pkg.Hl.Items, "SimpleItemConverter")
24+
fun itemSchema(typeVar: String) =
25+
TypeRef(MapperPkg.Hl.Items, "ItemSchema", genericArgs = listOf(TypeVar(typeVar)))
26+
27+
fun itemSchemaPartitionKey(objectType: TypeRef, pkType: TypeRef) =
28+
TypeRef(MapperPkg.Hl.Items, "ItemSchema.PartitionKey", genericArgs = listOf(objectType, pkType))
29+
30+
fun itemSchemaCompositeKey(objectType: TypeRef, pkType: TypeRef, skType: TypeRef) =
31+
TypeRef(MapperPkg.Hl.Items, "ItemSchema.CompositeKey", genericArgs = listOf(objectType, pkType, skType))
32+
33+
fun keySpec(keyType: TypeRef) = TypeRef(MapperPkg.Hl.Items, "KeySpec", genericArgs = listOf(keyType))
34+
val KeySpecByteArray = TypeRef(MapperPkg.Hl.Items, "KeySpec.ByteArray")
35+
val KeySpecNumber = TypeRef(MapperPkg.Hl.Items, "KeySpec.Number")
36+
val KeySpecString = TypeRef(MapperPkg.Hl.Items, "KeySpec.String")
37+
val AttributeDescriptor = TypeRef(MapperPkg.Hl.Items, "AttributeDescriptor")
38+
39+
fun itemConverter(objectType: TypeRef) =
40+
TypeRef(MapperPkg.Hl.Items, "ItemConverter", genericArgs = listOf(objectType))
41+
42+
val SimpleItemConverter = TypeRef(MapperPkg.Hl.Items, "SimpleItemConverter")
3143
}
3244

3345
object Model {
3446
fun tablePartitionKey(objectType: TypeRef, pkType: TypeRef) = TypeRef(
35-
Pkg.Hl.Model,
47+
MapperPkg.Hl.Model,
3648
"Table.PartitionKey",
3749
genericArgs = listOf(objectType, pkType),
3850
)
3951
fun tableCompositeKey(objectType: TypeRef, pkType: TypeRef, skType: TypeRef) = TypeRef(
40-
Pkg.Hl.Model,
52+
MapperPkg.Hl.Model,
4153
"Table.CompositeKey",
4254
genericArgs = listOf(objectType, pkType, skType),
4355
)
44-
val toItem = TypeRef(Pkg.Hl.Model, "toItem")
56+
val toItem = TypeRef(MapperPkg.Hl.Model, "toItem")
4557
}
4658

4759
object Values {
48-
fun valueConverter(value: Type) = TypeRef(Pkg.Hl.Values, "ValueConverter", genericArgs = listOf(value))
49-
val ItemToValueConverter = TypeRef(Pkg.Hl.Values, "ItemToValueConverter")
60+
fun valueConverter(value: Type) = TypeRef(MapperPkg.Hl.Values, "ValueConverter", genericArgs = listOf(value))
61+
val ItemToValueConverter = TypeRef(MapperPkg.Hl.Values, "ItemToValueConverter")
5062

5163
object Collections {
52-
val ListConverter = TypeRef(Pkg.Hl.CollectionValues, "ListConverter")
53-
val MapConverter = TypeRef(Pkg.Hl.CollectionValues, "MapConverter")
54-
55-
val StringSetConverter = TypeRef(Pkg.Hl.CollectionValues, "StringSetConverter")
56-
val CharSetConverter = TypeRef(Pkg.Hl.CollectionValues, "CharSetConverter")
57-
val CharArraySetConverter = TypeRef(Pkg.Hl.CollectionValues, "CharArraySetConverter")
58-
59-
val ByteSetConverter = TypeRef(Pkg.Hl.CollectionValues, "ByteSetConverter")
60-
val DoubleSetConverter = TypeRef(Pkg.Hl.CollectionValues, "DoubleSetConverter")
61-
val FloatSetConverter = TypeRef(Pkg.Hl.CollectionValues, "FloatSetConverter")
62-
val IntSetConverter = TypeRef(Pkg.Hl.CollectionValues, "IntSetConverter")
63-
val LongSetConverter = TypeRef(Pkg.Hl.CollectionValues, "LongSetConverter")
64-
val ShortSetConverter = TypeRef(Pkg.Hl.CollectionValues, "ShortSetConverter")
65-
66-
val UByteSetConverter = TypeRef(Pkg.Hl.CollectionValues, "UByteSetConverter")
67-
val UIntSetConverter = TypeRef(Pkg.Hl.CollectionValues, "UIntSetConverter")
68-
val ULongSetConverter = TypeRef(Pkg.Hl.CollectionValues, "ULongSetConverter")
69-
val UShortSetConverter = TypeRef(Pkg.Hl.CollectionValues, "UShortSetConverter")
64+
val ListConverter = TypeRef(MapperPkg.Hl.CollectionValues, "ListConverter")
65+
val MapConverter = TypeRef(MapperPkg.Hl.CollectionValues, "MapConverter")
66+
67+
val StringSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "StringSetConverter")
68+
val CharSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "CharSetConverter")
69+
val CharArraySetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "CharArraySetConverter")
70+
71+
val ByteSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "ByteSetConverter")
72+
val DoubleSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "DoubleSetConverter")
73+
val FloatSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "FloatSetConverter")
74+
val IntSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "IntSetConverter")
75+
val LongSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "LongSetConverter")
76+
val ShortSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "ShortSetConverter")
77+
78+
val UByteSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "UByteSetConverter")
79+
val UIntSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "UIntSetConverter")
80+
val ULongSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "ULongSetConverter")
81+
val UShortSetConverter = TypeRef(MapperPkg.Hl.CollectionValues, "UShortSetConverter")
7082
}
7183

7284
object Scalars {
73-
fun enumConverter(enumType: Type) = TypeRef(Pkg.Hl.ScalarValues, "EnumConverter", genericArgs = listOf(enumType))
74-
75-
val BooleanConverter = TypeRef(Pkg.Hl.ScalarValues, "BooleanConverter")
76-
val StringConverter = TypeRef(Pkg.Hl.ScalarValues, "StringConverter")
77-
val CharConverter = TypeRef(Pkg.Hl.ScalarValues, "CharConverter")
78-
val CharArrayConverter = TypeRef(Pkg.Hl.ScalarValues, "CharArrayConverter")
79-
80-
val ByteConverter = TypeRef(Pkg.Hl.ScalarValues, "ByteConverter")
81-
val ByteArrayConverter = TypeRef(Pkg.Hl.ScalarValues, "ByteArrayConverter")
82-
val DoubleConverter = TypeRef(Pkg.Hl.ScalarValues, "DoubleConverter")
83-
val FloatConverter = TypeRef(Pkg.Hl.ScalarValues, "FloatConverter")
84-
val IntConverter = TypeRef(Pkg.Hl.ScalarValues, "IntConverter")
85-
val LongConverter = TypeRef(Pkg.Hl.ScalarValues, "LongConverter")
86-
val ShortConverter = TypeRef(Pkg.Hl.ScalarValues, "ShortConverter")
87-
val UByteConverter = TypeRef(Pkg.Hl.ScalarValues, "UByteConverter")
88-
val UIntConverter = TypeRef(Pkg.Hl.ScalarValues, "UIntConverter")
89-
val ULongConverter = TypeRef(Pkg.Hl.ScalarValues, "ULongConverter")
90-
val UShortConverter = TypeRef(Pkg.Hl.ScalarValues, "UShortConverter")
91-
92-
val BooleanToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "BooleanToStringConverter")
93-
val CharArrayToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "TextConverters.CharArrayToStringConverter")
94-
val CharToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "TextConverters.CharToStringConverter")
95-
val StringToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "TextConverters.StringToStringConverter")
96-
val ByteToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "NumberConverters.ByteToStringConverter")
97-
val DoubleToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "NumberConverters.DoubleToStringConverter")
98-
val FloatToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "NumberConverters.FloatToStringConverter")
99-
val IntToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "NumberConverters.IntToStringConverter")
100-
val LongToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "NumberConverters.LongToStringConverter")
101-
val ShortToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "NumberConverters.ShortToStringConverter")
102-
val UByteToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "NumberConverters.UByteToStringConverter")
103-
val UIntToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "NumberConverters.UIntToStringConverter")
104-
val ULongToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "NumberConverters.ULongToStringConverter")
105-
val UShortToStringConverter = TypeRef(Pkg.Hl.ScalarValues, "NumberConverters.UShortToStringConverter")
85+
fun enumConverter(enumType: Type) = TypeRef(MapperPkg.Hl.ScalarValues, "EnumConverter", genericArgs = listOf(enumType))
86+
87+
val BooleanConverter = TypeRef(MapperPkg.Hl.ScalarValues, "BooleanConverter")
88+
val StringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "StringConverter")
89+
val CharConverter = TypeRef(MapperPkg.Hl.ScalarValues, "CharConverter")
90+
val CharArrayConverter = TypeRef(MapperPkg.Hl.ScalarValues, "CharArrayConverter")
91+
92+
val ByteConverter = TypeRef(MapperPkg.Hl.ScalarValues, "ByteConverter")
93+
val ByteArrayConverter = TypeRef(MapperPkg.Hl.ScalarValues, "ByteArrayConverter")
94+
val DoubleConverter = TypeRef(MapperPkg.Hl.ScalarValues, "DoubleConverter")
95+
val FloatConverter = TypeRef(MapperPkg.Hl.ScalarValues, "FloatConverter")
96+
val IntConverter = TypeRef(MapperPkg.Hl.ScalarValues, "IntConverter")
97+
val LongConverter = TypeRef(MapperPkg.Hl.ScalarValues, "LongConverter")
98+
val ShortConverter = TypeRef(MapperPkg.Hl.ScalarValues, "ShortConverter")
99+
val UByteConverter = TypeRef(MapperPkg.Hl.ScalarValues, "UByteConverter")
100+
val UIntConverter = TypeRef(MapperPkg.Hl.ScalarValues, "UIntConverter")
101+
val ULongConverter = TypeRef(MapperPkg.Hl.ScalarValues, "ULongConverter")
102+
val UShortConverter = TypeRef(MapperPkg.Hl.ScalarValues, "UShortConverter")
103+
104+
val BooleanToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "BooleanToStringConverter")
105+
val CharArrayToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "TextConverters.CharArrayToStringConverter")
106+
val CharToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "TextConverters.CharToStringConverter")
107+
val StringToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "TextConverters.StringToStringConverter")
108+
val ByteToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "NumberConverters.ByteToStringConverter")
109+
val DoubleToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "NumberConverters.DoubleToStringConverter")
110+
val FloatToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "NumberConverters.FloatToStringConverter")
111+
val IntToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "NumberConverters.IntToStringConverter")
112+
val LongToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "NumberConverters.LongToStringConverter")
113+
val ShortToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "NumberConverters.ShortToStringConverter")
114+
val UByteToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "NumberConverters.UByteToStringConverter")
115+
val UIntToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "NumberConverters.UIntToStringConverter")
116+
val ULongToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "NumberConverters.ULongToStringConverter")
117+
val UShortToStringConverter = TypeRef(MapperPkg.Hl.ScalarValues, "NumberConverters.UShortToStringConverter")
106118
}
107119

108120
object SmithyTypes {
109-
val DefaultInstantConverter = TypeRef(Pkg.Hl.SmithyTypeValues, "InstantConverter.Default")
110-
val UrlConverter = TypeRef(Pkg.Hl.SmithyTypeValues, "UrlConverter")
111-
val DefaultDocumentConverter = TypeRef(Pkg.Hl.SmithyTypeValues, "DocumentConverter.Default")
121+
val DefaultInstantConverter = TypeRef(MapperPkg.Hl.SmithyTypeValues, "InstantConverter.Default")
122+
val UrlConverter = TypeRef(MapperPkg.Hl.SmithyTypeValues, "UrlConverter")
123+
val DefaultDocumentConverter = TypeRef(MapperPkg.Hl.SmithyTypeValues, "DocumentConverter.Default")
112124
}
113125
}
114126

115127
object PipelineImpl {
116-
val HReqContextImpl = TypeRef(Pkg.Hl.PipelineImpl, "HReqContextImpl")
117-
val MapperContextImpl = TypeRef(Pkg.Hl.PipelineImpl, "MapperContextImpl")
118-
val Operation = TypeRef(Pkg.Hl.PipelineImpl, "Operation")
128+
val HReqContextImpl = TypeRef(MapperPkg.Hl.PipelineImpl, "HReqContextImpl")
129+
val MapperContextImpl = TypeRef(MapperPkg.Hl.PipelineImpl, "MapperContextImpl")
130+
val Operation = TypeRef(MapperPkg.Hl.PipelineImpl, "Operation")
119131
}
120132
}

0 commit comments

Comments
 (0)