aboutsummaryrefslogtreecommitdiff
path: root/core-database/src/main/scala/xyz/driver/core/database/Converters.scala
blob: b0054adff104e0e6d441c2081271b604a3feaf18 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package xyz.driver.core.database

import scala.reflect.ClassTag

/**
  * Helper methods for converting between table rows and Scala objects
  */
trait Converters {
  def fromStringOrThrow[ADT](entityStr: String, mapper: (String => Option[ADT]), entityName: String): ADT =
    mapper(entityStr).getOrElse(throw DatabaseException(s"Invalid $entityName in database: $entityStr"))

  def expectValid[ADT](mapper: String => Option[ADT], query: String)(implicit ct: ClassTag[ADT]): ADT =
    fromStringOrThrow[ADT](query, mapper, ct.toString())

  def expectExistsAndValid[ADT](mapper: String => Option[ADT], query: Option[String], contextMsg: String = "")(
      implicit ct: ClassTag[ADT]): ADT = {
    expectValid[ADT](mapper, query.getOrElse(throw DatabaseException(contextMsg)))
  }

  def expectValidOrEmpty[ADT](mapper: String => Option[ADT], query: Option[String], contextMsg: String = "")(
      implicit ct: ClassTag[ADT]): Option[ADT] = {
    query.map(expectValid[ADT](mapper, _))
  }
}
final case class DatabaseException(message: String = "Database access error") extends RuntimeException(message)