All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jetbrains.kotlinx.dataframe.io.utils.kt Maven / Gradle / Ivy

package org.jetbrains.kotlinx.dataframe.io

import org.jetbrains.kotlinx.dataframe.codeGen.FieldType
import org.jetbrains.kotlinx.dataframe.codeGen.GeneratedField
import org.jetbrains.kotlinx.dataframe.codeGen.ValidFieldName
import org.jetbrains.kotlinx.dataframe.impl.DELIMITERS_REGEX
import org.jetbrains.kotlinx.dataframe.impl.toCamelCaseByDelimiters
import org.jetbrains.kotlinx.dataframe.schema.ColumnSchema
import kotlin.reflect.typeOf

internal fun String.withTopInterfaceName(topInterfaceName: ValidFieldName): String =
    if (startsWith("${topInterfaceName.quotedIfNeeded}.")) this else "${topInterfaceName.quotedIfNeeded}.$this"

internal fun String.withoutTopInterfaceName(topInterfaceName: ValidFieldName): String =
    if (startsWith("${topInterfaceName.quotedIfNeeded}.")) {
        substringAfter("${topInterfaceName.quotedIfNeeded}.")
    } else {
        this
    }

internal fun String.snakeToLowerCamelCase(): String = toCamelCaseByDelimiters(DELIMITERS_REGEX)

internal fun String.snakeToUpperCamelCase(): String =
    snakeToLowerCamelCase()
        .replaceFirstChar { it.uppercaseChar() }

internal fun String.toNullable() = if (this.last() == '?') this else "$this?"

internal interface IsObject {
    val isObject: Boolean
}

/** Helper function to create a [GeneratedField] without [GeneratedField.columnSchema]. */
internal fun generatedFieldOf(
    fieldName: ValidFieldName,
    columnName: String,
    overrides: Boolean,
    fieldType: FieldType,
): GeneratedField =
    GeneratedField(
        fieldName = fieldName,
        columnName = columnName,
        overrides = overrides,
        columnSchema = ColumnSchema.Value(typeOf()), // unused
        fieldType = fieldType,
    )

/** Helper function to create a [GeneratedField] for enums. */
internal fun generatedEnumFieldOf(fieldName: ValidFieldName, columnName: String): GeneratedField =
    generatedFieldOf(
        fieldName = fieldName,
        columnName = columnName,
        overrides = false,
        fieldType = FieldType.ValueFieldType(typeOf().toString()), // all enums will be of type String
    )

/** Small helper function to produce a new enum Marker. */
internal fun produceNewEnum(
    name: String,
    topInterfaceName: ValidFieldName,
    values: List,
    nullable: Boolean,
    produceAdditionalMarker: ProduceAdditionalMarker,
): OpenApiMarker.Enum {
    val enumName = ValidFieldName.of(name.snakeToUpperCamelCase())
    val enumMarker = OpenApiMarker.Enum(
        name = enumName.quotedIfNeeded,
        fields = values.map {
            generatedEnumFieldOf(
                fieldName = ValidFieldName.of(it),
                columnName = it,
            )
        },
        nullable = nullable,
        topInterfaceName = topInterfaceName,
    )
    val newName = produceAdditionalMarker(enumName, enumMarker, isTopLevelObject = false)

    return enumMarker.withName(newName)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy