diff options
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.scala | 25 |
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) |