All Downloads are FREE. Search and download functionalities are using the official Maven repository.

harness.sql.query.IntQueryResult.scala Maven / Gradle / Ivy

There is a newer version: 5.1.3
Show newest version
package harness.sql.query

import harness.serviceTracer.*
import harness.sql.Database
import harness.sql.error.QueryError
import harness.zio.*
import zio.*

final class IntQueryResult private[query] (queryName: String, fragment: Fragment, effect: ZIO[Database, QueryError, Int]) {

  def execute: ZIO[Database, QueryError, Int] =
    effect @@
      Telemetry.telemetrize("Executed SQL query", Logger.LogLevel.Trace, "query-name" -> queryName) @@
      ServiceTracer.trace(TraceClosure("Database", "Live", "write"), "query-name" -> queryName)

  inline def unit: ZIO[Database, QueryError, Unit] = execute.unit

  inline private def withSizeCheck(
      inline check: Int => Boolean,
      inline expectedStr: => String,
  ): ZIO[Database, QueryError, Unit] =
    execute.flatMap { actual =>
      ZIO.fail(QueryError(queryName, fragment.sql, QueryError.Cause.InvalidResultSetSize(expectedStr, actual))).unlessDiscard(check(actual))
    }

  def expectSize(expected: Int): ZIO[Database, QueryError, Unit] =
    withSizeCheck(_ == expected, expected.toString)

  def single: ZIO[Database, QueryError, Unit] = expectSize(1)

  def option: ZIO[Database, QueryError, Unit] = withSizeCheck(a => a == 0 || a == 1, "0..1")

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy