/* sbt -- Simple Build Tool
 * Copyright 2009  Mark Harrah
 */
package sbt

	import java.io.IOException

object ErrorHandling
{
	def translate[T](msg: => String)(f: => T) =
		try { f }
		catch {
			case e: IOException => throw new TranslatedIOException(msg + e.toString, e)
			case e: Exception => throw new TranslatedException(msg + e.toString, e)
		}

	def wideConvert[T](f: => T): Either[Throwable, T] =
		try { Right(f) }
		catch
		{
			case ex @ (_: Exception | _: StackOverflowError) => Left(ex)
			case err @ (_: ThreadDeath | _: VirtualMachineError) => throw err
			case x: Throwable => Left(x)
		}

	def convert[T](f: => T): Either[Exception, T] =
		try { Right(f) }
		catch { case e: Exception => Left(e) }

	def reducedToString(e: Throwable): String =
		if(e.getClass == classOf[RuntimeException])
		{
			val msg = e.getMessage
			if(msg == null || msg.isEmpty) e.toString else msg
		}
		else
			e.toString
}
sealed class TranslatedException private[sbt](msg: String, cause: Throwable) extends RuntimeException(msg, cause)
{
	override def toString = msg
}
final class TranslatedIOException private[sbt](msg: String, cause: IOException) extends TranslatedException(msg, cause)