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

com.tersesystems.echopraxia.plusscala.async.DefaultAsyncLoggerMethods.scala Maven / Gradle / Ivy

package com.tersesystems.echopraxia.plusscala.async

import com.tersesystems.echopraxia.api.Level._
import com.tersesystems.echopraxia.api._
import com.tersesystems.echopraxia.plusscala.api.Condition
import com.tersesystems.echopraxia.plusscala.spi.DefaultMethodsSupport
import com.tersesystems.echopraxia.spi.FieldConstants

import java.util.function
import scala.compat.java8.FunctionConverters._

/**
 * Default Async Logger Methods with source code implicits.
 */
trait DefaultAsyncLoggerMethods[FB] extends AsyncLoggerMethods[FB] {
  self: DefaultMethodsSupport[FB] =>

  // ------------------------------------------------------------------------
  // TRACE

  override def ifTraceEnabled(consumer: Handle => Unit): Unit =
    handleConsumer(TRACE, consumer)

  override def ifTraceEnabled(condition: Condition)(consumer: Handle => Unit): Unit =
    handleConsumer(TRACE, condition, consumer)

  /**
   * Logs statement at TRACE level.
   *
   * @param message
   *   the given message.
   */
  def trace(message: String): Unit =
    handleMessage(TRACE, message)

  /**
   * Logs statement at TRACE level using a field builder function.
   *
   * @param message
   *   the message.
   * @param f
   *   the field builder function.
   */
  def trace(message: String, f: FB => FieldBuilderResult): Unit =
    handleMessageArgs(TRACE, message, f)

  /**
   * Logs statement at TRACE level with exception.
   *
   * @param message
   *   the message.
   * @param e
   *   the given exception.
   */
  def trace(message: String, e: Throwable): Unit =
    handleMessageThrowable(TRACE, message, e)

  /**
   * Conditionally logs statement at TRACE level.
   *
   * @param condition
   *   the given condition.
   * @param message
   *   the message.
   */
  def trace(condition: Condition, message: String): Unit =
    handleConditionMessage(TRACE, condition, message)

  /**
   * Conditionally logs statement at TRACE level using a field builder function.
   *
   * @param condition
   *   the given condition.
   * @param message
   *   the message.
   * @param f
   *   the field builder function.
   */
  def trace(condition: Condition, message: String, f: FB => FieldBuilderResult): Unit =
    handleConditionMessageArgs(TRACE, condition, message, f)

  /**
   * Conditionally logs statement at TRACE level with exception.
   *
   * @param condition
   *   the given condition.
   * @param message
   *   the message.
   * @param e
   *   the given exception.
   */
  def trace(condition: Condition, message: String, e: Throwable): Unit =
    handleConditionMessageThrowable(TRACE, condition, message, e)

  // -----------------------------------------------------------
  // DEBUG

  override def ifDebugEnabled(consumer: Handle => Unit): Unit =
    handleConsumer(DEBUG, consumer)

  override def ifDebugEnabled(condition: Condition)(consumer: Handle => Unit): Unit =
    handleConsumer(DEBUG, condition, consumer)

  /**
   * Logs statement at DEBUG level.
   *
   * @param message
   *   the given message.
   */
  def debug(message: String): Unit =
    handleMessage(DEBUG, message)

  /**
   * Logs statement at DEBUG level using a field builder function.
   *
   * @param message
   *   the message.
   * @param f
   *   the field builder function.
   */
  def debug(message: String, f: FB => FieldBuilderResult): Unit =
    handleMessageArgs(DEBUG, message, f)

  /**
   * Logs statement at DEBUG level with exception.
   *
   * @param message
   *   the message.
   * @param e
   *   the given exception.
   */
  def debug(message: String, e: Throwable): Unit =
    handleMessageThrowable(DEBUG, message, e)

  /**
   * Conditionally logs statement at DEBUG level.
   *
   * @param condition
   *   the given condition.
   * @param message
   *   the message.
   */
  def debug(condition: Condition, message: String): Unit =
    handleConditionMessage(DEBUG, condition, message)

  /**
   * Conditionally logs statement at DEBUG level with exception.
   *
   * @param condition
   *   the given condition.
   * @param message
   *   the message.
   * @param e
   *   the given exception.
   */
  def debug(condition: Condition, message: String, e: Throwable): Unit =
    handleConditionMessageThrowable(DEBUG, condition, message, e)

  /**
   * Conditionally logs statement at DEBUG level using a field builder function.
   *
   * @param condition
   *   the given condition.
   * @param message
   *   the message.
   * @param f
   *   the field builder function.
   */
  def debug(condition: Condition, message: String, f: FB => FieldBuilderResult): Unit =
    handleConditionMessageArgs(DEBUG, condition, message, f)

  // -----------------------------------------------------------
  // INFO

  override def ifInfoEnabled(consumer: Handle => Unit): Unit =
    handleConsumer(INFO, consumer)

  override def ifInfoEnabled(condition: Condition)(consumer: Handle => Unit): Unit =
    handleConsumer(INFO, condition, consumer)

  /**
   * Logs statement at INFO level.
   *
   * @param message
   *   the given message.
   */
  def info(message: String): Unit =
    handleMessage(INFO, message)

  /**
   * Logs statement at INFO level using a field builder function.
   *
   * @param message
   *   the message.
   * @param f
   *   the field builder function.
   */
  def info(message: String, f: FB => FieldBuilderResult): Unit =
    handleMessageArgs(INFO, message, f)

  /**
   * Logs statement at INFO level with exception.
   *
   * @param message
   *   the message.
   * @param e
   *   the given exception.
   */
  def info(message: String, e: Throwable): Unit =
    handleMessageThrowable(INFO, message, e)

  /**
   * Conditionally logs statement at INFO level.
   *
   * @param condition
   *   the given condition.
   * @param message
   *   the message.
   */
  def info(condition: Condition, message: String): Unit =
    handleConditionMessage(INFO, condition, message)

  /**
   * Conditionally logs statement at INFO level using a field builder function.
   *
   * @param condition
   *   the given condition.
   * @param message
   *   the message.
   * @param f
   *   the field builder function.
   */
  def info(condition: Condition, message: String, f: FB => FieldBuilderResult): Unit =
    handleConditionMessageArgs(INFO, condition, message, f)

  /**
   * Conditionally logs statement at INFO level with exception.
   *
   * @param condition
   *   the given condition.
   * @param message
   *   the message.
   * @param e
   *   the given exception.
   */
  def info(condition: Condition, message: String, e: Throwable): Unit =
    handleConditionMessageThrowable(INFO, condition, message, e)

  // -----------------------------------------------------------
  // WARN

  override def ifWarnEnabled(consumer: Handle => Unit): Unit =
    handleConsumer(WARN, consumer)

  override def ifWarnEnabled(condition: Condition)(consumer: Handle => Unit): Unit =
    handleConsumer(WARN, condition, consumer)

  /**
   * Logs statement at WARN level.
   *
   * @param message
   *   the given message.
   */
  def warn(message: String): Unit =
    handleMessage(WARN, message)

  /**
   * Logs statement at WARN level using a field builder function.
   *
   * @param message
   *   the message.
   * @param f
   *   the field builder function.
   */
  def warn(message: String, f: FB => FieldBuilderResult): Unit =
    handleMessageArgs(WARN, message, f)

  /**
   * Logs statement at WARN level with exception.
   *
   * @param message
   *   the message.
   * @param e
   *   the given exception.
   */
  def warn(message: String, e: Throwable): Unit =
    handleMessageThrowable(WARN, message, e)

  def warn(condition: Condition, message: String): Unit =
    handleConditionMessage(WARN, condition, message)

  def warn(condition: Condition, message: String, e: Throwable): Unit =
    handleConditionMessageThrowable(WARN, condition, message, e)

  def warn(condition: Condition, message: String, f: FB => FieldBuilderResult): Unit =
    handleConditionMessageArgs(WARN, condition, message, f)

  // -----------------------------------------------------------
  // ERROR

  override def ifErrorEnabled(consumer: Handle => Unit): Unit =
    handleConsumer(ERROR, consumer)

  override def ifErrorEnabled(condition: Condition)(consumer: Handle => Unit): Unit =
    handleConsumer(ERROR, condition, consumer)

  def error(message: String): Unit = { handleMessage(ERROR, message) }

  def error(message: String, f: FB => FieldBuilderResult): Unit =
    handleMessageArgs(ERROR, message, f)

  def error(message: String, e: Throwable): Unit =
    handleMessageThrowable(ERROR, message, e)

  def error(condition: Condition, message: String): Unit =
    handleConditionMessage(ERROR, condition, message)

  def error(condition: Condition, message: String, f: FB => FieldBuilderResult): Unit =
    handleConditionMessageArgs(ERROR, condition, message, f)

  def error(condition: Condition, message: String, e: Throwable): Unit =
    handleConditionMessageThrowable(ERROR, condition, message, e)

  // -----------------------------------------------------------
  // Internal methods

  @inline
  private def onlyException(e: Throwable): FieldBuilderResult = {
    Field.keyValue(FieldConstants.EXCEPTION, Value.exception(e))
  }

  @inline
  private def handleConsumer(level: Level, consumer: Handle => Unit): Unit = {
    core.asyncLog(level, (h: LoggerHandle[FB]) => consumer(h), fieldBuilder)
  }

  @inline
  private def handleConsumer(level: Level, condition: Condition, consumer: Handle => Unit): Unit = {
    core.asyncLog(level, condition.asJava, (h: LoggerHandle[FB]) => consumer(h), fieldBuilder)
  }

  @inline
  private implicit def toHandle(h: LoggerHandle[FB]): Handle = new Handle {
    @inline
    override def apply(message: String): Unit = h.log(message)
    @inline
    override def apply(message: String, e: Throwable): Unit = {
      val f: function.Function[FB, FieldBuilderResult] = _ => onlyException(e)
      h.log(message, f)
    }
    @inline
    override def apply(message: String, f: FB => FieldBuilderResult): Unit =
      h.log(message, f.asJava)
  }

  @inline
  private def handleMessage(level: Level, message: String): Unit =
    handleConsumer(level, handle => handle(message))

  @inline
  private def handleMessageArgs(level: Level, message: String, f: FB => FieldBuilderResult): Unit =
    handleConsumer(level, handle => handle(message, f))

  @inline
  private def handleMessageThrowable(level: Level, message: String, e: Throwable): Unit =
    handleConsumer(level, handle => handle(message, e))

  @inline
  private def handleConditionMessage(level: Level, condition: Condition, message: String): Unit =
    handleConsumer(level, condition, handle => handle(message))

  @inline
  private def handleConditionMessageArgs(level: Level, condition: Condition, message: String, f: FB => FieldBuilderResult): Unit = {
    handleConsumer(level, condition, handle => handle(message, f))
  }

  @inline
  private def handleConditionMessageThrowable(level: Level, condition: Condition, message: String, e: Throwable): Unit = {
    handleConsumer(level, condition, handle => handle(message, e))
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy