File tree Expand file tree Collapse file tree
dataframe-openapi-generator/src/main/kotlin/org/jetbrains/kotlinx/dataframe/io Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -332,7 +332,12 @@ private fun Schema<*>.toMarker(
332332
333333 fields + = allSuperFields
334334 .filter {
335- it.fieldName.unquoted in requiredFields && it.fieldType.isNullable()
335+ it.fieldName.unquoted in requiredFields &&
336+ it.fieldType.isNullable() &&
337+ // Don't override intrinsically nullable types (like nullable enums) to be
338+ // non-null. Their nullability comes from the type itself, not from being
339+ // optional, so being required in a child schema cannot make them non-null.
340+ ! it.fieldType.refersToNullableMarker(getRefMarker, topInterfaceName)
336341 }.map {
337342 generatedFieldOf(
338343 fieldName = it.fieldName,
Original file line number Diff line number Diff line change @@ -3,6 +3,7 @@ package org.jetbrains.kotlinx.dataframe.io
33import org.jetbrains.kotlinx.dataframe.codeGen.FieldType
44import org.jetbrains.kotlinx.dataframe.codeGen.GeneratedField
55import org.jetbrains.kotlinx.dataframe.codeGen.ValidFieldName
6+ import org.jetbrains.kotlinx.dataframe.codeGen.name
67import org.jetbrains.kotlinx.dataframe.impl.toCamelCaseByDelimiters
78import org.jetbrains.kotlinx.dataframe.schema.ColumnSchema
89import kotlin.reflect.typeOf
@@ -23,6 +24,21 @@ internal fun String.snakeToUpperCamelCase(): String =
2324
2425internal fun String.toNullable () = if (this .last() == ' ?' ) this else " $this ?"
2526
27+ /* *
28+ * Returns whether this [FieldType] refers to a [Marker][OpenApiMarker] that is itself nullable
29+ * (such as a nullable enum, whose nullability is defined by the type and cannot be removed by
30+ * making a property required). Returns `false` for primitives and non-nullable markers.
31+ */
32+ internal fun FieldType.refersToNullableMarker (getRefMarker : GetRefMarker , topInterfaceName : ValidFieldName ): Boolean {
33+ val refName = name
34+ .removeSuffix(" ?" )
35+ .withoutTopInterfaceName(topInterfaceName)
36+ return when (val res = getRefMarker(refName)) {
37+ is MarkerResult .OpenApiMarker -> res.marker.nullable
38+ else -> false
39+ }
40+ }
41+
2642internal interface IsObject {
2743 val isObject: Boolean
2844}
You can’t perform that action at this time.
0 commit comments