Skip to content

Commit 9d47169

Browse files
committed
fix(model-api-gen): fixed ids not being part of enum serialization
1 parent 62edb4c commit 9d47169

File tree

2 files changed

+40
-18
lines changed

2 files changed

+40
-18
lines changed

model-api-gen-runtime/src/commonMain/kotlin/org/modelix/metamodel/IPropertyValueSerializer.kt

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,24 +78,32 @@ object OptionalIntPropertySerializer : IPropertyValueSerializer<Int?> {
7878
}
7979
}
8080

81-
class MandatoryEnumSerializer<E : Enum<*>>(private val valueOf: (String?) -> E) : IPropertyValueSerializer<E> {
81+
class MandatoryEnumSerializer<E : Enum<*>>(
82+
private val memberIdOf: (E) -> String,
83+
private val fromString: (String?) -> E
84+
) : IPropertyValueSerializer<E> {
85+
8286
override fun serialize(value: E): String {
83-
return value.name
87+
return memberIdOf(value) + "/" + value.name
8488
}
8589

8690
override fun deserialize(serialized: String?): E {
8791
val id = serialized?.substringBefore('/')
88-
return valueOf(id)
92+
return fromString(id)
8993
}
9094
}
9195

92-
class OptionalEnumSerializer<E : Enum<*>>(private val valueOf: (String?) -> E?) : IPropertyValueSerializer<Enum<*>?> {
93-
override fun serialize(value: Enum<*>?): String? {
94-
return value?.name
96+
class OptionalEnumSerializer<E : Enum<*>>(
97+
private val memberIdOf: (E) -> String,
98+
private val fromString: (String) -> E
99+
) : IPropertyValueSerializer<E?> {
100+
101+
override fun serialize(value: E?): String? {
102+
return value?.let { memberIdOf(it) + "/" + it.name}
95103
}
96104

97-
override fun deserialize(serialized: String?): Enum<*>? {
98-
return serialized?.let { valueOf(serialized) }
105+
override fun deserialize(serialized: String?): E? {
106+
return serialized?.let { fromString(it) }
99107
}
100108
}
101109

model-api-gen/src/main/kotlin/org/modelix/metamodel/generator/MetaModelGenerator.kt

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -115,22 +115,33 @@ class MetaModelGenerator(val outputDir: Path, val nameConfig: NameConfig = NameC
115115
}
116116

117117
private fun generateEnumFile(enum: ProcessedEnum) {
118-
val builder = TypeSpec.enumBuilder(enum.name)
118+
val constructorSpec = FunSpec.constructorBuilder()
119+
.addParameter("memberId", String::class)
120+
.addParameter("presentation", String::class.asTypeName().copy(nullable = true))
121+
.build()
119122

120-
builder.primaryConstructor(
121-
FunSpec.constructorBuilder()
122-
.addParameter("presentation", String::class.asTypeName().copy(nullable = true))
123-
.build()
124-
)
123+
val enumBuilder = TypeSpec.enumBuilder(enum.name)
124+
.primaryConstructor(constructorSpec)
125+
.addProperty(
126+
PropertySpec.builder("memberId", String::class)
127+
.initializer("memberId")
128+
.build()
129+
)
130+
.addProperty(
131+
PropertySpec.builder("presentation", String::class.asTypeName().copy(nullable = true))
132+
.initializer("presentation")
133+
.build()
134+
)
125135

126136
val getLiteralFunBuilder = FunSpec.builder("getLiteralByMemberId")
127137
.addParameter("memberId", String::class)
128138
val getLiteralCodeBuilder = CodeBlock.builder().beginControlFlow("return when (memberId) {")
129139

130140
for (member in enum.getAllMembers()) {
131-
builder.addEnumConstant(
141+
enumBuilder.addEnumConstant(
132142
member.name,
133143
TypeSpec.anonymousClassBuilder()
144+
.addSuperclassConstructorParameter("%S", member.memberId)
134145
.addSuperclassConstructorParameter(
135146
if (member.presentation == null) "null" else "%S",
136147
member.presentation ?: "")
@@ -156,7 +167,7 @@ class MetaModelGenerator(val outputDir: Path, val nameConfig: NameConfig = NameC
156167
)
157168
.build()
158169

159-
val generatedEnum = builder.addType(companion).build()
170+
val generatedEnum = enumBuilder.addType(companion).build()
160171

161172
FileSpec.builder(enum.language.name, enum.name)
162173
.addFileComment(headerComment)
@@ -345,7 +356,9 @@ class MetaModelGenerator(val outputDir: Path, val nameConfig: NameConfig = NameC
345356
if (feature.type is EnumPropertyType) {
346357
if (serializer == MandatoryEnumSerializer::class.asTypeName()) {
347358
propBuilder.initializer(
348-
"""newProperty(%S, %S, %T { if (it != null) %T.getLiteralByMemberId(it) else %T.defaultValue() }, ${feature.optional})""",
359+
"""newProperty(%S, %S, %T({ it.memberId },
360+
|{ if (it != null) %T.getLiteralByMemberId(it) else %T.defaultValue() }),
361+
|${feature.optional})""".trimMargin(),
349362
feature.originalName,
350363
feature.uid,
351364
serializer,
@@ -354,7 +367,8 @@ class MetaModelGenerator(val outputDir: Path, val nameConfig: NameConfig = NameC
354367
)
355368
} else {
356369
propBuilder.initializer(
357-
"""newProperty(%S, %S, %T { %T.getLiteralByMemberId(it) }, ${feature.optional})""",
370+
"""newProperty(%S, %S, %T( { it.memberId }, { %T.getLiteralByMemberId(it) }),
371+
|${feature.optional})""".trimMargin(),
358372
feature.originalName,
359373
feature.uid,
360374
serializer,

0 commit comments

Comments
 (0)