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

value.CanonicalName.kt Maven / Gradle / Ivy

package io.toolisticon.kotlin.avro.value

import _ktx.StringKtx
import io.toolisticon.kotlin.avro.AvroKotlin.Separator
import io.toolisticon.kotlin.avro._ktx.KotlinKtx.create
import io.toolisticon.kotlin.avro.value.Name.Companion.toName
import io.toolisticon.kotlin.avro.value.Namespace.Companion.toNamespace
import java.nio.file.Path
import kotlin.io.path.Path

/**
 * Combining namespace and name as a [java.lang.Class#canonicalName].
 */
@JvmInline
value class CanonicalName private constructor(override val value: Pair) : PairType {
  companion object {
    val EMPTY = Namespace.EMPTY + Name.EMPTY

    fun parse(fqn: String) = CanonicalName(value = create {
      if (fqn.contains(Separator.NAME)) {
        val (namespace, name) = fqn.substringBeforeLast(Separator.NAME) to fqn.substringAfterLast(Separator.NAME)
        Namespace(namespace) to Name(name)
      } else {
        Namespace.EMPTY to Name(fqn)
      }
    })

    fun Pair.toCanonicalName(): CanonicalName = CanonicalName(
      namespace = this.first.toNamespace(),
      name = this.second.toName()
    )

    fun String.toCanonicalName(): CanonicalName = CanonicalName.parse(this)
  }

  constructor(namespace: Namespace, name: Name) : this(namespace to name)

  val namespace: Namespace get() = value.first
  val name: Name get() = value.second

  val fqn: String get() = "${namespace.value}${if (namespace.isEmpty()) "" else Separator.NAME}${name.value}"

  /**
   * Turns a canonical (fqn) name to a file system [Path] using suffix.
   *
   * A java class `io.acme.Foo` would become `io/acme/Foo.java`.
   */
  fun toPath(fileExtension: String): Path = namespace.toPath().resolve(name.toPath(fileExtension)).normalize()

  fun toPath(specification: AvroSpecification): Path = toPath(specification.value)

  override fun toString() = StringKtx.toString("CanonicalName") {
    add(property = "fqn", value = fqn, wrap = "'")
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy