/* sbt -- Simple Build Tool * Copyright 2008, 2009 Mark Harrah */ package xsbt abstract class Logger extends NotNull { def getLevel: Level.Value def setLevel(newLevel: Level.Value) def enableTrace(flag: Boolean) def traceEnabled: Boolean def atLevel(level: Level.Value) = level.id >= getLevel.id def trace(t: => Throwable): Unit final def debug(message: => String): Unit = log(Level.Debug, message) final def info(message: => String): Unit = log(Level.Info, message) final def warn(message: => String): Unit = log(Level.Warn, message) final def error(message: => String): Unit = log(Level.Error, message) def success(message: => String): Unit def log(level: Level.Value, message: => String): Unit def control(event: ControlEvent.Value, message: => String): Unit def logAll(events: Seq[LogEvent]): Unit /** Defined in terms of other methods in Logger and should not be called from them. */ final def log(event: LogEvent) { event match { case s: Success => success(s.msg) case l: Log => log(l.level, l.msg) case t: Trace => trace(t.exception) case setL: SetLevel => setLevel(setL.newLevel) case setT: SetTrace => enableTrace(setT.enabled) case c: ControlEvent => control(c.event, c.msg) } } } sealed trait LogEvent extends NotNull final class Success(val msg: String) extends LogEvent final class Log(val level: Level.Value, val msg: String) extends LogEvent final class Trace(val exception: Throwable) extends LogEvent final class SetLevel(val newLevel: Level.Value) extends LogEvent final class SetTrace(val enabled: Boolean) extends LogEvent final class ControlEvent(val event: ControlEvent.Value, val msg: String) extends LogEvent object ControlEvent extends Enumeration { val Start, Header, Finish = Value } /** An enumeration defining the levels available for logging. A level includes all of the levels * with id larger than its own id. For example, Warn (id=3) includes Error (id=4).*/ object Level extends Enumeration with NotNull { val Debug = Value(1, "debug") val Info = Value(2, "info") val Warn = Value(3, "warn") val Error = Value(4, "error") /** Defines the label to use for success messages. A success message is logged at the info level but * uses this label. Because the label for levels is defined in this module, the success * label is also defined here. */ val SuccessLabel = "success" // added because elements was renamed to iterator in 2.8.0 nightly def levels = Debug :: Info :: Warn :: Error :: Nil /** Returns the level with the given name wrapped in Some, or None if no level exists for that name. */ def apply(s: String) = levels.find(s == _.toString) /** Same as apply, defined for use in pattern matching. */ private[xsbt] def unapply(s: String) = apply(s) }