Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: total rehaul #15

Draft
wants to merge 15 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
blah
  • Loading branch information
brizzbuzz committed Aug 5, 2024
commit 1b7e829632a1d21db6f98434ab3d1bf044efe518
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.TypeName

sealed interface SerializableSchema {
val utilPackage: String
val serializerTypeName: TypeName
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.AnnotationSpec
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import io.bkbn.skribe.codegen.domain.SkribeSpec
import kotlinx.serialization.Serializable

data class SkribeArraySchema(
override val name: String,
override val requiresSerialization: Boolean = false,
val items: SkribeSchema,
) : SkribePotentiallyScalarSchema {

override fun isScalar(): Boolean {
if (items is SkribeScalarSchema) return true
if (items is SkribePotentiallyScalarSchema) return items.isScalar()
return false
}

context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = List::class.asClassName().parameterizedBy(
when (items.requiresSerialization) {
true -> items.toKotlinTypeName().copy(
annotations = listOf(
AnnotationSpec.builder(Serializable::class).apply {
addMember("with = %T::class", (items as SerializableSchema).serializerTypeName)
}.build()
)
)

false -> items.toKotlinTypeName()
}
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import io.bkbn.skribe.codegen.domain.SkribeSpec

data class SkribeBooleanSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = Boolean::class.asClassName()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import io.bkbn.skribe.codegen.domain.SkribeSpec

data class SkribeComposedSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = String::class.asClassName()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import io.bkbn.skribe.codegen.domain.SkribeSpec
import kotlinx.datetime.LocalDate

data class SkribeDateSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = LocalDate::class.asClassName()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import io.bkbn.skribe.codegen.domain.SkribeSpec
import kotlinx.datetime.Instant

data class SkribeDateTimeSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = Instant::class.asClassName()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import io.bkbn.skribe.codegen.domain.SkribeSpec

data class SkribeEmailSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = String::class.asClassName()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import io.bkbn.skribe.codegen.domain.SkribeSpec
import kotlinx.serialization.json.JsonElement

data class SkribeFreeFormSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = JsonElement::class.asClassName()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import io.bkbn.skribe.codegen.domain.SkribeSpec

data class SkribeIntegerSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = Int::class.asClassName()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import io.bkbn.skribe.codegen.domain.SkribeSpec

data class SkribeNumberSchema(
override val name: String,
override val requiresSerialization: Boolean = true,
override val utilPackage: String,
) : SkribeScalarSchema, SerializableSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = Number::class.asClassName()
override val serializerTypeName: TypeName = ClassName(utilPackage, "NumberSerializer")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package io.bkbn.skribe.codegen.domain.schema

sealed interface SkribePotentiallyScalarSchema : SkribeSchema {
fun isScalar(): Boolean
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.TypeName
import io.bkbn.skribe.codegen.domain.SkribeSpec
import io.bkbn.skribe.codegen.utils.StringUtils.convertToPascalCase
import io.bkbn.skribe.codegen.utils.StringUtils.getRefKey

data class SkribeReferenceSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
val ref: String,
) : SkribeSchema {
context(SkribeSpec)
// TODO: Hacky w/ pascal crap
override fun toKotlinTypeName(): TypeName = ClassName(modelPackage, ref.getRefKey().convertToPascalCase())
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package io.bkbn.skribe.codegen.domain.schema

sealed interface SkribeScalarSchema : SkribeSchema
Original file line number Diff line number Diff line change
@@ -1,17 +1,7 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.AnnotationSpec
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import io.bkbn.skribe.codegen.domain.SkribeSpec
import io.bkbn.skribe.codegen.utils.StringUtils.convertToPascalCase
import io.bkbn.skribe.codegen.utils.StringUtils.getRefKey
import kotlinx.datetime.Instant
import kotlinx.datetime.LocalDate
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.JsonElement

sealed interface SkribeSchema {
// TODO: Value class?
Expand All @@ -21,136 +11,3 @@ sealed interface SkribeSchema {
context(SkribeSpec)
fun toKotlinTypeName(): TypeName
}

sealed interface SkribeScalarSchema : SkribeSchema

sealed interface SkribePotentiallyScalarSchema : SkribeSchema {
fun isScalar(): Boolean
}

sealed interface SerializableSchema {
val utilPackage: String
val serializerTypeName: TypeName
}

data class SkribeComposedSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = String::class.asClassName()
}

data class SkribeStringSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = String::class.asClassName()
}

data class SkribeArraySchema(
override val name: String,
override val requiresSerialization: Boolean = false,
val items: SkribeSchema,
) : SkribePotentiallyScalarSchema {

override fun isScalar(): Boolean {
if (items is SkribeScalarSchema) return true
if (items is SkribePotentiallyScalarSchema) return items.isScalar()
return false
}

context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = List::class.asClassName().parameterizedBy(
when (items.requiresSerialization) {
true -> items.toKotlinTypeName().copy(
annotations = listOf(
AnnotationSpec.builder(Serializable::class).apply {
addMember("with = %T::class", (items as SerializableSchema).serializerTypeName)
}.build()
)
)

false -> items.toKotlinTypeName()
}
)
}

data class SkribeUuidSchema(
override val name: String,
override val requiresSerialization: Boolean = true,
override val utilPackage: String,
) : SkribeScalarSchema, SerializableSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = ClassName("com.benasher44.uuid", "Uuid")
override val serializerTypeName: TypeName = ClassName(utilPackage, "UuidSerializer")
}

data class SkribeReferenceSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
val ref: String,
) : SkribeSchema {
context(SkribeSpec)
// TODO: Hacky w/ pascal crap
override fun toKotlinTypeName(): TypeName = ClassName(modelPackage, ref.getRefKey().convertToPascalCase())
}

data class SkribeDateSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = LocalDate::class.asClassName()
}

data class SkribeDateTimeSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = Instant::class.asClassName()
}

data class SkribeBooleanSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = Boolean::class.asClassName()
}

data class SkribeIntegerSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = Int::class.asClassName()
}

data class SkribeEmailSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = String::class.asClassName()
}

data class SkribeNumberSchema(
override val name: String,
override val requiresSerialization: Boolean = true,
override val utilPackage: String,
) : SkribeScalarSchema, SerializableSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = Number::class.asClassName()
override val serializerTypeName: TypeName = ClassName(utilPackage, "NumberSerializer")
}

data class SkribeFreeFormSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = JsonElement::class.asClassName()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.asClassName
import io.bkbn.skribe.codegen.domain.SkribeSpec

data class SkribeStringSchema(
override val name: String,
override val requiresSerialization: Boolean = false,
) : SkribeScalarSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = String::class.asClassName()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.bkbn.skribe.codegen.domain.schema

import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.TypeName
import io.bkbn.skribe.codegen.domain.SkribeSpec

data class SkribeUuidSchema(
override val name: String,
override val requiresSerialization: Boolean = true,
override val utilPackage: String,
) : SkribeScalarSchema, SerializableSchema {
context(SkribeSpec)
override fun toKotlinTypeName(): TypeName = ClassName("com.benasher44.uuid", "Uuid")

override val serializerTypeName: TypeName = ClassName(utilPackage, "UuidSerializer")
}
Loading