Q: Enum型の使い方は?

A: Enum型は、Codec.derivedEnumを使用して自動的にエンコード/デコードされます。

Enum型はCodec.derivedEnumを使用して自動的にエンコード/デコードされます。以下の例では、ColorというEnum型を定義し、Codec.derivedEnumを使用してエンコード/デコードを行っています。

Enum型はEnumが持つ値をそのまま文字列として扱います。例えば、Color.Red"Red"として扱われます。これはMySQLのEnum型で使用することができます。

Example:

import ldbc.codec.*

enum Color:
  case Red, Blue, Yellow
object Color:
  given Codec[Color] = Codec.derivedEnum[Color]

val query = sql"SELECT 'Red'".query[Color].to[Option]

Enumを文字列ではなくEnumが持つフィールドの値を使用してエンコード/デコードする場合は、Codecを拡張して実装する必要があります。以下の例では、ColorというEnum型を定義し、Codecを拡張してエンコード/デコードを行っています。

import ldbc.codec.*

enum Color(val colorCode: String):
  case Red extends Color("FF0000")
  case Blue extends Color("0000FF")
  case Yellow extends Color("FFFF00")
object Color:
  given Codec[Color] = Codec[String].eimap { str =>
    Color.values.find(_.colorCode == str) match
      case Some(color) => Right(color)
      case None        => Left(s"Invalid color code: $str")
  } (_.colorCode)

val query = sql"SELECT 'FF0000'".query[Color].to[Option]

参考資料