Usage

package demo

import zio.*

import com.augustnagro.magnum.*
import com.augustnagro.magnum.ziomagnum.*

object ZIOMagnumDemo extends zio.ZIOAppDefault:

  @Table(PostgresDbType, SqlNameMapper.CamelToSnakeCase)
  case class User(@Id id: Int, name: String) derives DbCodec

  val repo = Repo[User, User, Int]

  // Example of inserting a user into the database
  private val program: RIO[DataSource, Unit] = repo.zInsert(User(0, "Alice"))

  override def run = program
    .provide:
      // Provide necessary layers, e.g., database connection, logging, etc.
      Scope.default >>> dataSourceLayer(
        "jdbc:postgresql://localhost:5432/mydb",
        "user",
        "password"
      )

Raw query

// Import necessary libraries
  val program: ZIO[DataSource, Throwable, Vector[User]] = sql"SELECT * FROM users"
          .zQuery[User]

ZIO Stream

for:
 zs: ZStream[DataSource, Throwable, User] = sql"SELECT * FROM users".zStream[User]()
 _ <- zs.runForeach(user => ZIO.logDebug(s"User from stream: $user"))
 count <- zs.runCount
yield count

Transactional support

val program: RIO[DataSource, Vector[Int]] =
          for
            tx <- transaction(
              userRepo.zInsert(User(0, "Test User"))
                *>
                  sql"SELECT booommmmm FROM users".zQuery[Int].sandbox.ignore
            )
            count <- sql"SELECT COUNT(*) FROM users".zQuery[Int]
          yield count

Will automatically rollback.