Skip to content

SimpleTable does not work with opaque types #98

@NovaMage

Description

@NovaMage

The example below is also available as a public repo.
@bishabosha @lihaoyi

// ThisBuild / scalaVersion := "3.7.3"
// val scalaSqlVersion = "0.2.1"
// libraryDependencies += "com.lihaoyi" %% "scalasql" % scalaSqlVersion
// libraryDependencies += "com.lihaoyi" %% "scalasql-namedtuples" % scalaSqlVersion

package com.example

import scalasql.dialects.PostgresDialect.*
import scalasql.simple.{*, given}

opaque type UserId = java.util.UUID

object UserId {

  given TypeMapper[UserId] = new UuidType

}

case class User(id: UserId, firstName: String, lastName: String)

object User extends SimpleTable[User]

def find(id: UserId)(using db: DbApi.Txn): Option[User] = {
  db.run(User.select.filter(_.id === id)).headOption
}

The above won't compile with the following error:

value === is not a member of com.example.UserId match {
  case scalasql.namedtuples.SimpleTable.Nested =>
    scalasql.namedtuples.SimpleTable.Record[com.example.UserId,
      scalasql.core.Expr]
  case Any => scalasql.core.Expr[com.example.UserId]
} <:
  scalasql.namedtuples.SimpleTable.Record[com.example.UserId, scalasql.core.Expr
    ]
 | scalasql.core.Expr[com.example.UserId] - did you mean com.example.UserId match {
  case scalasql.namedtuples.SimpleTable.Nested =>
    scalasql.namedtuples.SimpleTable.Record[com.example.UserId,
      scalasql.core.Expr]
  case Any => scalasql.core.Expr[com.example.UserId]
} <:
  scalasql.namedtuples.SimpleTable.Record[com.example.UserId, scalasql.core.Expr
    ]
 | scalasql.core.Expr[com.example.UserId].==?

As far as I understand, opaque types used in SimpleTables do not reduce appropiately in the Records match types used to convert them into Expr.

This has been stopping us from using SimpleTable as we use opaque types for all ids of models in our system (to avoid passing an incorrect ids anywhere in the system).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions