Мы успешно используем enumeratum при работе со значениями enum, как с Circe, так и с Quill. Мы определяем что-то вроде этого:
sealed abstract class TopicType(val value: String) extends StringEnumEntry
object TopicType extends StringEnum[TopicType] with StringCirceEnum[TopicType] with StringQuillEnum[TopicType] {
object Info extends TopicType("info")
object Warning extends TopicType("warning")
val values: immutable.IndexedSeq[TopicType] = findValues
}
// case class representing our MySQL payload table
case class Payload(id: String, topic: TopicType)
и используем Payload
при декодировании / кодировании mysql и json с использованием Quill и Circe. С Quill и MySQL это прекрасно работает со следующей таблицей:
create table payload(
id varchar(36) not null primary key,
topic_type enum ('info', 'warning') not null
)
Однако я не могу на всю жизнь понять, как заставить это работать при использовании необязательных полей для нашего перечисляемого типа и обнуляемых типов MySQL.
Мы хотим использовать класс полезной нагрузки следующим образом:
case class Payload(id: String, topic: Option[TopicType])
и с такой таблицей SQL (topic_type
может быть нулевым):
create table payload(
id varchar(36) not null primary key,
topic_type enum ('info', 'warning')
)
При попытке использовать необязательный topic
и читать из нашей базы данных, используя Quill с:
...
run {
query[Payload].filter(payload => payload.id == lift(someId))
}
, мы получаем
java.util.NoSuchElementException: null is not a member of ValueEnum (warning, info) (ValueEnum.scala:58)
Может быть, нам нужно указать некоторыепользовательский декодер / кодировщик для обработки параметров / нулевых значений?