aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuicommon/logging/Implicits.scala
blob: 109d52a78d982a0756386d114810f681f61183f4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package xyz.driver.pdsuicommon.logging

import java.io.File
import java.net.{URI, URL}
import java.nio.file.Path
import java.time.{LocalDate, 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 localDateToPhiString(x: LocalDate): 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))
  }

}