Skip to content

Commit 38d9f64

Browse files
authored
Refine implementation (#17)
* tidy up polymorphism Polymorphism doesn't really exist as a TsElement, it's more like metadata. So remove it and directly convert sealed polymorphic descriptors in TsElementConverter.kt To do this it requires making TsElementConverter.kt return multiple elements... but I guess that's more flexible, so it's an improvement * prevent warnings by making funs open, and some code tidying * 'memoize' some generator code, and add kdoc, and make things open to prevent warnings * #9 initial Tuple implementation * code tidy up * finish Tuple implementation - create tuple serializer builder - tuple tests - re-use TsProperty for tuples (make 'optional' a boolean field, two data classes wasn't needed) - remove TsExport (TypeScript generation can be controlled entirely through Kxs descriptors) * move files to correct directory 🤦‍♀️ * rename 'tuple' tests
1 parent c316b95 commit 38d9f64

24 files changed

+956
-384
lines changed

docs/code/example/example-enum-class-01.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
@file:Suppress("PackageDirectoryMismatch", "unused")
33
package dev.adamko.kxstsgen.example.exampleEnumClass01
44

5-
import kotlinx.serialization.*
6-
import dev.adamko.kxstsgen.*
75
import kotlinx.serialization.*
86
import dev.adamko.kxstsgen.*
97

docs/code/example/example-enum-class-02.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
@file:Suppress("PackageDirectoryMismatch", "unused")
33
package dev.adamko.kxstsgen.example.exampleEnumClass02
44

5-
import kotlinx.serialization.*
6-
import dev.adamko.kxstsgen.*
75
import kotlinx.serialization.*
86
import dev.adamko.kxstsgen.*
97

docs/code/example/example-tuple-01.kt

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// This file was automatically generated from tuples.md by Knit tool. Do not edit.
2+
@file:Suppress("PackageDirectoryMismatch", "unused")
3+
package dev.adamko.kxstsgen.example.exampleTuple01
4+
5+
import dev.adamko.kxstsgen.*
6+
import dev.adamko.kxstsgen.core.experiments.TupleSerializer
7+
import kotlinx.serialization.*
8+
9+
@Serializable(with = SimpleTypes.SimpleTypesSerializer::class)
10+
data class SimpleTypes(
11+
val aString: String,
12+
var anInt: Int,
13+
val aDouble: Double?,
14+
val bool: Boolean,
15+
private val privateMember: String,
16+
) {
17+
// Create `SimpleTypesSerializer` inside `SimpleTypes`, so it
18+
// has access to the private property `privateMember`.
19+
object SimpleTypesSerializer : TupleSerializer<SimpleTypes>(
20+
"SimpleTypes",
21+
{
22+
// Provide all tuple elements, in order, using the 'elements' helper method.
23+
element(SimpleTypes::aString)
24+
element(SimpleTypes::anInt)
25+
element(SimpleTypes::aDouble)
26+
element(SimpleTypes::bool)
27+
element(SimpleTypes::privateMember)
28+
}
29+
) {
30+
override fun tupleConstructor(elements: List<*>): SimpleTypes {
31+
// When deserializing, the elements will be available as a list, in the order defined
32+
return SimpleTypes(
33+
elements[0] as String,
34+
elements[1] as Int,
35+
elements[2] as Double,
36+
elements[3] as Boolean,
37+
elements[4] as String,
38+
)
39+
}
40+
}
41+
}
42+
43+
fun main() {
44+
val tsGenerator = KxsTsGenerator()
45+
println(tsGenerator.generate(SimpleTypes.serializer()))
46+
}

docs/code/example/example-tuple-02.kt

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// This file was automatically generated from tuples.md by Knit tool. Do not edit.
2+
@file:Suppress("PackageDirectoryMismatch", "unused")
3+
package dev.adamko.kxstsgen.example.exampleTuple02
4+
5+
import dev.adamko.kxstsgen.*
6+
import dev.adamko.kxstsgen.core.experiments.TupleSerializer
7+
import kotlinx.serialization.*
8+
9+
@Serializable(with = OptionalFields.Serializer::class)
10+
data class OptionalFields(
11+
val requiredString: String,
12+
val optionalString: String = "",
13+
val nullableString: String?,
14+
val nullableOptionalString: String? = "",
15+
) {
16+
object Serializer : TupleSerializer<OptionalFields>(
17+
"OptionalFields",
18+
{
19+
element(OptionalFields::requiredString)
20+
element(OptionalFields::optionalString)
21+
element(OptionalFields::nullableString)
22+
element(OptionalFields::nullableOptionalString)
23+
}
24+
) {
25+
override fun tupleConstructor(elements: List<*>): OptionalFields {
26+
val iter = elements.iterator()
27+
return OptionalFields(
28+
iter.next() as String,
29+
iter.next() as String,
30+
iter.next() as String,
31+
iter.next() as String,
32+
)
33+
}
34+
}
35+
}
36+
37+
fun main() {
38+
val tsGenerator = KxsTsGenerator()
39+
println(tsGenerator.generate(OptionalFields.serializer()))
40+
}

docs/code/example/example-tuple-03.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// This file was automatically generated from tuples.md by Knit tool. Do not edit.
2+
@file:Suppress("PackageDirectoryMismatch", "unused")
3+
package dev.adamko.kxstsgen.example.exampleTuple03
4+
5+
import dev.adamko.kxstsgen.*
6+
import dev.adamko.kxstsgen.core.experiments.TupleSerializer
7+
import kotlinx.serialization.*
8+
9+
@Serializable(with = Coordinates.Serializer::class)
10+
data class Coordinates(
11+
val x: Int,
12+
val y: Int,
13+
val z: Int,
14+
) {
15+
object Serializer : TupleSerializer<Coordinates>(
16+
"Coordinates",
17+
{
18+
element(Coordinates::x)
19+
element(Coordinates::y)
20+
element(Coordinates::z)
21+
}
22+
) {
23+
override fun tupleConstructor(elements: List<*>): Coordinates {
24+
return Coordinates(
25+
elements[0] as Int,
26+
elements[1] as Int,
27+
elements[2] as Int,
28+
)
29+
}
30+
}
31+
}
32+
33+
fun main() {
34+
val tsGenerator = KxsTsGenerator()
35+
println(tsGenerator.generate(Coordinates.serializer()))
36+
}

docs/code/example/example-tuple-04.kt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// This file was automatically generated from tuples.md by Knit tool. Do not edit.
2+
@file:Suppress("PackageDirectoryMismatch", "unused")
3+
package dev.adamko.kxstsgen.example.exampleTuple04
4+
5+
import dev.adamko.kxstsgen.*
6+
import dev.adamko.kxstsgen.core.experiments.TupleSerializer
7+
import kotlinx.serialization.*
8+
9+
import dev.adamko.kxstsgen.example.exampleTuple03.Coordinates
10+
11+
@Serializable
12+
class GameLocations(
13+
val homeLocation: Coordinates,
14+
val allLocations: List<Coordinates>,
15+
val namedLocations: Map<String, Coordinates>,
16+
)
17+
18+
fun main() {
19+
val tsGenerator = KxsTsGenerator()
20+
println(tsGenerator.generate(GameLocations.serializer()))
21+
}

docs/code/test/TuplesTest.kt

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// This file was automatically generated from tuples.md by Knit tool. Do not edit.
2+
@file:Suppress("JSUnusedLocalSymbols")
3+
package dev.adamko.kxstsgen.example.test
4+
5+
import io.kotest.matchers.*
6+
import kotlinx.knit.test.*
7+
import org.junit.jupiter.api.Test
8+
import dev.adamko.kxstsgen.util.*
9+
10+
class TuplesTest {
11+
@Test
12+
fun testExampleTuple01() {
13+
captureOutput("ExampleTuple01") {
14+
dev.adamko.kxstsgen.example.exampleTuple01.main()
15+
}.normalizeJoin()
16+
.shouldBe(
17+
// language=TypeScript
18+
"""
19+
|export type SimpleTypes = [string, number, number | null, boolean, string];
20+
""".trimMargin()
21+
.normalize()
22+
)
23+
}
24+
25+
@Test
26+
fun testExampleTuple02() {
27+
captureOutput("ExampleTuple02") {
28+
dev.adamko.kxstsgen.example.exampleTuple02.main()
29+
}.normalizeJoin()
30+
.shouldBe(
31+
// language=TypeScript
32+
"""
33+
|export type OptionalFields = [string, string, string | null, string | null];
34+
""".trimMargin()
35+
.normalize()
36+
)
37+
}
38+
39+
@Test
40+
fun testExampleTuple03() {
41+
captureOutput("ExampleTuple03") {
42+
dev.adamko.kxstsgen.example.exampleTuple03.main()
43+
}.normalizeJoin()
44+
.shouldBe(
45+
// language=TypeScript
46+
"""
47+
|export type Coordinates = [number, number, number];
48+
""".trimMargin()
49+
.normalize()
50+
)
51+
}
52+
53+
@Test
54+
fun testExampleTuple04() {
55+
captureOutput("ExampleTuple04") {
56+
dev.adamko.kxstsgen.example.exampleTuple04.main()
57+
}.normalizeJoin()
58+
.shouldBe(
59+
// language=TypeScript
60+
"""
61+
|export interface GameLocations {
62+
| homeLocation: Coordinates;
63+
| allLocations: Coordinates[];
64+
| namedLocations: { [key: string]: Coordinates };
65+
|}
66+
|
67+
|export type Coordinates = [number, number, number];
68+
""".trimMargin()
69+
.normalize()
70+
)
71+
}
72+
}

docs/enums.md

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,6 @@ import dev.adamko.kxstsgen.*
2121

2222
### Simple enum
2323

24-
<!--- INCLUDE .*\.kt
25-
import kotlinx.serialization.*
26-
import dev.adamko.kxstsgen.*
27-
-->
28-
2924
```kotlin
3025
@Serializable
3126
enum class SomeType {

0 commit comments

Comments
 (0)