Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

View jczuchnowski's full-sized avatar
🎈

Jakub Czuchnowski jczuchnowski

🎈
View GitHub Profile
val db = Database.forConfig("h2mem1")
val queryAction: DBIO[Option[Int]] = ...
val result: Future[Option[Int]] = db.run(queryAction)
import zio.IO
trait AssetRepository {
def add(name: String, price: BigDecimal): IO[RepositoryFailure, AssetId]
def getById(id: AssetId): IO[RepositoryFailure, Option[Asset]]
def update(id: AssetId, name: String, price: BigDecimal): IO[RepositoryFailure, Unit]
}
trait DatabaseProvider {
def databaseProvider: DatabaseProvider.Service
}
object DatabaseProvider {
trait Service {
def db: UIO[BasicBackend#DatabaseDef]
}
}
trait LiveDatabaseProvider extends DatabaseProvider {
override val databaseProvider = new DatabaseProvider.Service {
override val db = ZIO.effectTotal(Database.forURL(url = "jdbc:h2:prod"))
}
}
trait PortfolioAssetRepository {
def portfolioAssetRepository: PortfolioAssetRepository.Service
}
object PortfolioAssetRepository {
trait Service {
def add(name: String, price: BigDecimal): IO[RepositoryException, AssetId]
def getById(id: AssetId): IO[RepositoryException, Option[Asset]]
db <- ZIO.accessM[DatabaseProvider](_.databaseProvider.db)
result <- ZIO.fromFuture(ec => db.run(dbio))
def fromDBIO[R](dbio: DBIO[R]): ZIO[DatabaseProvider, Throwable, R] =
for {
db <- ZIO.accessM[DatabaseProvider](_.databaseProvider.db)
r <- ZIO.fromFuture(ec => db.run(dbio))
} yield r
def fromStreamingDBIO[T](dbio: StreamingDBIO[_, T]): ZIO[DatabaseProvider, Throwable, ZStream[Any, Throwable, T]] =
for {
db <- ZIO.accessM[DatabaseProvider](_.databaseProvider.db)
r <- ZIO.effect(db.stream(dbio).toStream())
} yield r