aboutsummaryrefslogtreecommitdiff
path: root/core-database/src/main/scala/xyz/driver/core/database/Converters.scala
diff options
context:
space:
mode:
Diffstat (limited to 'core-database/src/main/scala/xyz/driver/core/database/Converters.scala')
-rw-r--r--core-database/src/main/scala/xyz/driver/core/database/Converters.scala25
1 files changed, 25 insertions, 0 deletions
diff --git a/core-database/src/main/scala/xyz/driver/core/database/Converters.scala b/core-database/src/main/scala/xyz/driver/core/database/Converters.scala
new file mode 100644
index 0000000..b0054ad
--- /dev/null
+++ b/core-database/src/main/scala/xyz/driver/core/database/Converters.scala
@@ -0,0 +1,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)