/
Trace.scala
66 lines (49 loc) · 1.34 KB
/
Trace.scala
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
63
64
65
66
package iog.psg.cardano.util
import java.io.{BufferedWriter, File, FileWriter}
import io.circe.Encoder
import scala.util.Try
import io.circe.syntax._
trait Trace extends AutoCloseable {
parent =>
implicit def s2Str[A](s: A)(implicit enc: Encoder[A]): String = s.asJson.spaces2
def apply(s: String): Unit
def withTrace(other: Trace): Trace = other match {
case NoOpTrace => this
case _ =>
new Trace {
override def apply(s: String): Unit = {
parent.apply(s)
other.apply(s)
}
override def close(): Unit = {
Try(parent.close()).recover {
case e => println(e)
}
Try(other.close()).recover {
case e => println(e)
}
}
}
}
}
object NoOpTrace extends Trace {
override def apply(s: String): Unit = ()
override def close(): Unit = ()
override def withTrace(other: Trace): Trace = other
}
object ConsoleTrace extends Trace {
override def apply(s: String): Unit = println(s)
override def close(): Unit = ()
}
class FileTrace(f: File) extends Trace {
private val traceFile = new BufferedWriter(new FileWriter(f))
override def apply(s: String): Unit = {
traceFile.write(s)
traceFile.newLine()
}
override def close(): Unit = {
Try(traceFile.close()).recover {
case e => println(e)
}
}
}