ghostdogpr / caliban

Functional GraphQL library for Scala

Home Page:https://ghostdogpr.github.io/caliban/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Scala 3 different schema derivation

guymers opened this issue · comments

The below produces different schemas depending on the Scala version:

@GQLName("ASTParameter")
sealed trait Parameter
object Parameter {
  implicit lazy val schema: Schema[Any, Parameter] = Schema.gen
}

@GQLName("ASTVariable")
case class Variable(name: String) extends Parameter
object Variable {
  implicit val schema: Schema[Any, Variable] = Schema.gen
}

@GQLName("ASTValue")
sealed trait Value extends Parameter
object Value {
  @GQLName("ASTValueBoolean")
  case class Boolean(value: scala.Boolean) extends Value
  object Boolean {
    implicit val schema: Schema[Any, Boolean] = Schema.gen
  }

  @GQLName("ASTValueList")
  case class List(values: Chunk[Value]) extends Value
  object List {
    implicit lazy val schema: Schema[Any, List] = Schema.gen
  }

  implicit lazy val schema: Schema[Any, Value] = Schema.gen
}

case class Queries(
  param: Parameter,
)
object Queries {
  implicit val schema: Schema[Any, Queries] = Schema.gen
}

val schema = {
  val queries = Queries(param = Variable("temp"))
  graphQL(RootResolver(queries))
}

Scala 2:

schema {
  query: Queries
}

union ASTParameter = ASTValueBoolean | ASTValueList | ASTVariable

union ASTValue = ASTValueBoolean | ASTValueList

type ASTValueBoolean {
  value: Boolean!
}

type ASTValueList {
  values: [ASTValue!]!
}

type ASTVariable {
  name: String!
}

type Queries {
  param: ASTParameter!
}

Scala 3:

schema {
  query: Queries
}

union ASTParameter = ASTValue | ASTVariable

union ASTValue = ASTValueBoolean | ASTValueList

type ASTValueBoolean {
  value: Boolean!
}

type ASTValueList {
  values: [ASTValue!]!
}

type ASTVariable {
  name: String!
}

type Queries {
  param: ASTParameter!
}

The Scala 3 schema is invalid due to having the union ASTValue as a member of the union ASTParameter.