Skip to content

Commit

Permalink
Merge pull request #738 from ant8e/noop_strict_eval
Browse files Browse the repository at this point in the history
Add strict evaluation option
  • Loading branch information
danicheg authored Apr 16, 2023
2 parents 95e26a1 + 8bf2527 commit 177bec8
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,19 @@ import cats.Applicative
object NoOpFactory extends LoggerFactoryGenCompanion {
def apply[F[_]: Applicative]: LoggerFactory[F] = impl[F]

def impl[F[_]](implicit F: Applicative[F]): LoggerFactory[F] = new LoggerFactory[F] {
override def getLoggerFromName(name: String): SelfAwareStructuredLogger[F] = {
val _ = name
NoOpLogger.impl[F]
def strictEvalArgs[F[_]: Applicative]: LoggerFactory[F] = impl_[F](evaluateArgs = true)

def impl[F[_]](implicit F: Applicative[F]): LoggerFactory[F] = impl_[F](evaluateArgs = false)

private def impl_[F[_]](evaluateArgs: Boolean)(implicit F: Applicative[F]): LoggerFactory[F] =
new LoggerFactory[F] {
override def getLoggerFromName(name: String): SelfAwareStructuredLogger[F] = {
val _ = name
NoOpLogger.impl_[F](evaluateArgs)
}

override def fromName(name: String): F[SelfAwareStructuredLogger[F]] =
F.pure(getLoggerFromName(name))
}

override def fromName(name: String): F[SelfAwareStructuredLogger[F]] =
F.pure(getLoggerFromName(name))
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,20 @@ import org.typelevel.log4cats.SelfAwareStructuredLogger

object NoOpLogger {
def apply[F[_]: Applicative]: SelfAwareStructuredLogger[F] = impl[F]
def impl[F[_]: Applicative]: SelfAwareStructuredLogger[F] = new SelfAwareStructuredLogger[F] {

def strictEvalArgs[F[_]: Applicative]: SelfAwareStructuredLogger[F] =
impl_[F](evaluateArgs = true)

def impl[F[_]: Applicative] = impl_[F](evaluateArgs = false)

private[noop] def impl_[F[_]: Applicative](evaluateArgs: Boolean): SelfAwareStructuredLogger[F] =
if (evaluateArgs) strictImpl else lazyImpl

private def lazyImpl[F[_]: Applicative] = new SelfAwareStructuredLogger[F] {

val no: F[Boolean] = Applicative[F].pure(false)
val unit: F[Unit] = Applicative[F].pure(())

@inline override def isTraceEnabled: F[Boolean] = no
@inline override def isDebugEnabled: F[Boolean] = no
@inline override def isInfoEnabled: F[Boolean] = no
Expand Down Expand Up @@ -56,4 +66,45 @@ object NoOpLogger {
@inline override def error(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] =
unit
}

private def strictImpl[F[_]: Applicative] = new SelfAwareStructuredLogger[F] {

val yes: F[Boolean] = Applicative[F].pure(true)
def void(arg: => Any): F[Unit] = Applicative[F].pure {
val _ = arg
()
}

@inline override def isTraceEnabled: F[Boolean] = yes
@inline override def isDebugEnabled: F[Boolean] = yes
@inline override def isInfoEnabled: F[Boolean] = yes
@inline override def isWarnEnabled: F[Boolean] = yes
@inline override def isErrorEnabled: F[Boolean] = yes
@inline override def trace(t: Throwable)(msg: => String): F[Unit] = void(t)
@inline override def trace(msg: => String): F[Unit] = void(msg)
@inline override def trace(ctx: Map[String, String])(msg: => String): F[Unit] = void(msg)
@inline override def debug(t: Throwable)(msg: => String): F[Unit] = void(msg)
@inline override def debug(msg: => String): F[Unit] = void(msg)
@inline override def debug(ctx: Map[String, String])(msg: => String): F[Unit] = void(msg)
@inline override def info(t: Throwable)(msg: => String): F[Unit] = void(msg)
@inline override def info(msg: => String): F[Unit] = void(msg)
@inline override def info(ctx: Map[String, String])(msg: => String): F[Unit] = void(msg)
@inline override def warn(t: Throwable)(msg: => String): F[Unit] = void(msg)
@inline override def warn(msg: => String): F[Unit] = void(msg)
@inline override def warn(ctx: Map[String, String])(msg: => String): F[Unit] = void(msg)
@inline override def error(t: Throwable)(msg: => String): F[Unit] = void(msg)
@inline override def error(msg: => String): F[Unit] = void(msg)
@inline override def error(ctx: Map[String, String])(msg: => String): F[Unit] = void(msg)
@inline override def trace(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] =
void(msg)
@inline override def debug(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] =
void(msg)
@inline override def info(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] =
void(msg)
@inline override def warn(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] =
void(msg)
@inline override def error(ctx: Map[String, String], t: Throwable)(msg: => String): F[Unit] =
void(msg)
}

}

0 comments on commit 177bec8

Please sign in to comment.