From 0000a65ab4479a2a40e2d6468036438e9705b4aa Mon Sep 17 00:00:00 2001 From: vlad Date: Tue, 13 Jun 2017 10:25:55 -0700 Subject: Initial extraction of Driver non-specific utilities --- .../driver/common/logging/DefaultPhiLogger.scala | 17 ++++++ .../xyz/driver/common/logging/Implicits.scala | 62 ++++++++++++++++++++++ .../xyz/driver/common/logging/PhiLogger.scala | 15 ++++++ .../xyz/driver/common/logging/PhiLogging.scala | 20 +++++++ .../xyz/driver/common/logging/PhiString.scala | 6 +++ .../driver/common/logging/PhiStringContext.scala | 8 +++ .../scala/xyz/driver/common/logging/Unsafe.scala | 6 +++ .../scala/xyz/driver/common/logging/package.scala | 3 ++ 8 files changed, 137 insertions(+) create mode 100644 src/main/scala/xyz/driver/common/logging/DefaultPhiLogger.scala create mode 100644 src/main/scala/xyz/driver/common/logging/Implicits.scala create mode 100644 src/main/scala/xyz/driver/common/logging/PhiLogger.scala create mode 100644 src/main/scala/xyz/driver/common/logging/PhiLogging.scala create mode 100644 src/main/scala/xyz/driver/common/logging/PhiString.scala create mode 100644 src/main/scala/xyz/driver/common/logging/PhiStringContext.scala create mode 100644 src/main/scala/xyz/driver/common/logging/Unsafe.scala create mode 100644 src/main/scala/xyz/driver/common/logging/package.scala (limited to 'src/main/scala/xyz/driver/common/logging') diff --git a/src/main/scala/xyz/driver/common/logging/DefaultPhiLogger.scala b/src/main/scala/xyz/driver/common/logging/DefaultPhiLogger.scala new file mode 100644 index 0000000..ca25c44 --- /dev/null +++ b/src/main/scala/xyz/driver/common/logging/DefaultPhiLogger.scala @@ -0,0 +1,17 @@ +package xyz.driver.common.logging + +import org.slf4j.{Logger => Underlying} + +class DefaultPhiLogger private[logging](underlying: Underlying) extends PhiLogger { + + def error(message: PhiString): Unit = underlying.error(message.text) + + def warn(message: PhiString): Unit = underlying.warn(message.text) + + def info(message: PhiString): Unit = underlying.info(message.text) + + def debug(message: PhiString): Unit = underlying.debug(message.text) + + def trace(message: PhiString): Unit = underlying.trace(message.text) + +} diff --git a/src/main/scala/xyz/driver/common/logging/Implicits.scala b/src/main/scala/xyz/driver/common/logging/Implicits.scala new file mode 100644 index 0000000..e486cc1 --- /dev/null +++ b/src/main/scala/xyz/driver/common/logging/Implicits.scala @@ -0,0 +1,62 @@ +package xyz.driver.common.logging + +import java.io.File +import java.net.{URI, URL} +import java.nio.file.Path +import java.time.LocalDateTime +import java.util.UUID + +import scala.concurrent.duration.Duration + +trait Implicits { + + // DO NOT ADD! + // phi"$fullName" is easier to write, than phi"${Unsafe(fullName)}" + // If you wrote the second version, it means that you know, what you doing. + // implicit def toPhiString(s: String): PhiString = Unsafe(s) + + implicit def toPhiStringContext(sc: StringContext): PhiStringContext = new PhiStringContext(sc) + + implicit def booleanToPhiString(x: Boolean): PhiString = Unsafe(x.toString) + + implicit def uriToPhiString(x: URI): PhiString = Unsafe(x.toString) + + implicit def urlToPhiString(x: URL): PhiString = Unsafe(x.toString) + + implicit def pathToPhiString(x: Path): PhiString = Unsafe(x.toString) + + implicit def fileToPhiString(x: File): PhiString = Unsafe(x.toString) + + implicit def localDateTimeToPhiString(x: LocalDateTime): PhiString = Unsafe(x.toString) + + implicit def durationToPhiString(x: Duration): PhiString = Unsafe(x.toString) + + implicit def uuidToPhiString(x: UUID): PhiString = Unsafe(x.toString) + + implicit def tuple2ToPhiString[T1, T2](x: (T1, T2)) + (implicit inner1: T1 => PhiString, + inner2: T2 => PhiString): PhiString = x match { + case (a, b) => phi"($a, $b)" + } + + implicit def tuple3ToPhiString[T1, T2, T3](x: (T1, T2, T3)) + (implicit inner1: T1 => PhiString, + inner2: T2 => PhiString, + inner3: T3 => PhiString): PhiString = x match { + case (a, b, c) => phi"($a, $b, $c)" + } + + implicit def optionToPhiString[T](opt: Option[T])(implicit inner: T => PhiString): PhiString = opt match { + case None => phi"None" + case Some(x) => phi"Some($x)" + } + + implicit def iterableToPhiString[T](xs: Iterable[T])(implicit inner: T => PhiString): PhiString = { + Unsafe(xs.map(inner(_).text).mkString("Col(", ", ", ")")) + } + + implicit def throwableToPhiString(x: Throwable): PhiString = { + Unsafe(Option(x.getMessage).getOrElse(x.getClass.getName)) + } + +} diff --git a/src/main/scala/xyz/driver/common/logging/PhiLogger.scala b/src/main/scala/xyz/driver/common/logging/PhiLogger.scala new file mode 100644 index 0000000..c8907a8 --- /dev/null +++ b/src/main/scala/xyz/driver/common/logging/PhiLogger.scala @@ -0,0 +1,15 @@ +package xyz.driver.common.logging + +trait PhiLogger { + + def error(message: PhiString): Unit + + def warn(message: PhiString): Unit + + def info(message: PhiString): Unit + + def debug(message: PhiString): Unit + + def trace(message: PhiString): Unit + +} diff --git a/src/main/scala/xyz/driver/common/logging/PhiLogging.scala b/src/main/scala/xyz/driver/common/logging/PhiLogging.scala new file mode 100644 index 0000000..b8cdcf0 --- /dev/null +++ b/src/main/scala/xyz/driver/common/logging/PhiLogging.scala @@ -0,0 +1,20 @@ +package xyz.driver.common.logging + +import org.slf4j.LoggerFactory + +trait PhiLogging extends Implicits { + + protected val logger: PhiLogger = new DefaultPhiLogger(LoggerFactory.getLogger(getClass.getName)) + + /** + * Logs the failMessage on an error level, if isSuccessful is false. + * @return isSuccessful + */ + protected def loggedError(isSuccessful: Boolean, failMessage: PhiString): Boolean = { + if (!isSuccessful) { + logger.error(failMessage) + } + isSuccessful + } + +} diff --git a/src/main/scala/xyz/driver/common/logging/PhiString.scala b/src/main/scala/xyz/driver/common/logging/PhiString.scala new file mode 100644 index 0000000..ce1b90c --- /dev/null +++ b/src/main/scala/xyz/driver/common/logging/PhiString.scala @@ -0,0 +1,6 @@ +package xyz.driver.common.logging + +class PhiString(private[logging] val text: String) { + // scalastyle:off + @inline def +(that: PhiString) = new PhiString(this.text + that.text) +} diff --git a/src/main/scala/xyz/driver/common/logging/PhiStringContext.scala b/src/main/scala/xyz/driver/common/logging/PhiStringContext.scala new file mode 100644 index 0000000..8b3c9d0 --- /dev/null +++ b/src/main/scala/xyz/driver/common/logging/PhiStringContext.scala @@ -0,0 +1,8 @@ +package xyz.driver.common.logging + +final class PhiStringContext(val sc: StringContext) extends AnyVal { + def phi(args: PhiString*): PhiString = { + val phiArgs = args.map(_.text) + new PhiString(sc.s(phiArgs: _*)) + } +} diff --git a/src/main/scala/xyz/driver/common/logging/Unsafe.scala b/src/main/scala/xyz/driver/common/logging/Unsafe.scala new file mode 100644 index 0000000..c605c85 --- /dev/null +++ b/src/main/scala/xyz/driver/common/logging/Unsafe.scala @@ -0,0 +1,6 @@ +package xyz.driver.common.logging + +/** + * Use it with care! + */ +case class Unsafe[T](private[logging] val value: T) extends PhiString(Option(value).map(_.toString).getOrElse("")) diff --git a/src/main/scala/xyz/driver/common/logging/package.scala b/src/main/scala/xyz/driver/common/logging/package.scala new file mode 100644 index 0000000..479f59e --- /dev/null +++ b/src/main/scala/xyz/driver/common/logging/package.scala @@ -0,0 +1,3 @@ +package xyz.driver.common + +package object logging extends Implicits -- cgit v1.2.3