-
Notifications
You must be signed in to change notification settings - Fork 26
/
Control.scala
73 lines (67 loc) · 2.32 KB
/
Control.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
67
68
69
70
71
72
73
/* sbt -- Simple Build Tool
* Copyright 2008, 2009 Mark Harrah
*/
package sbt
/** The trap methods execute the provided code in a try block and handle a thrown exception.*/
object Control
{
def trap[T](errorMessagePrefix: => String, log: Logger)(execute: => Either[String, T]): Either[String, T] =
try { execute }
catch { case e => log.trace(e); Left(errorMessagePrefix + e.toString) }
def trapAndFinally[T](errorMessagePrefix: => String, log: Logger)(execute: => Either[String, T])(doFinally: => Unit): Either[String, T] =
try { execute }
catch { case e => log.trace(e); Left(errorMessagePrefix + e.toString) }
finally { trapAndLog(log)(doFinally) }
def trapUnit(errorMessagePrefix: => String, log: Logger)(execute: => Option[String]): Option[String] =
try { execute }
catch { case e => log.trace(e); Some(errorMessagePrefix + e.toString) }
def trapUnitAndFinally(errorMessagePrefix: => String, log: Logger)(execute: => Option[String])(doFinally: => Unit): Option[String] =
try { execute }
catch { case e => log.trace(e); Some(errorMessagePrefix + e.toString) }
finally { trapAndLog(log)(doFinally) }
def trap(execute: => Unit)
{
try { execute }
catch { case e: Exception => () }
}
def trapAndLog(log: Logger)(execute: => Unit)
{
try { execute }
catch { case e => log.trace(e); log.error(e.toString) }
}
def convertException[T](t: => T): Either[Exception, T] =
{
try { Right(t) }
catch { case e: Exception => Left(e) }
}
def convertErrorMessage[T](log: Logger)(t: => T): Either[String, T] =
{
try { Right(t) }
catch { case e: Exception => log.trace(e); Left(e.toString) }
}
def getOrError[T](result: Either[String, T]): T = result.fold(error, x=>x)
final def lazyFold[T](list: List[T])(f: T => Option[String]): Option[String] =
list match
{
case Nil => None
case head :: tail =>
f(head) match
{
case None => lazyFold(tail)(f)
case x => x
}
}
final def lazyFold[T, S](list: List[T], value: S)(f: (S,T) => Either[String, S]): Either[String, S] =
list match
{
case Nil => Right(value)
case head :: tail =>
f(value, head) match
{
case Right(newValue) => lazyFold(tail, newValue)(f)
case x => x
}
}
def thread[T](e: Either[String, T])(f: T => Option[String]): Option[String] =
e.right.flatMap( t => f(t).toLeft(()) ).left.toOption
}