TrySugar

trait TrySugar

Trait providing an implicit class that adds a toOr method to Try, which converts Success to Good, and Failure to Bad, as well as a validating method, which takes one or more validation functions and returns either the same Try if either the Try had already failed or its value passes all the functions, or `ValidationFailedException` containing an error message describing the first validation that failed.

Here's an example validation method, which passes if the given Int is evenly divisible by 10 (i.e., the result will be <code>Pass</code>). If the value does not pass this test, the result is a <code>Fail</code> containing a helpful error message string.

scala> import org.scalactic._
import org.scalactic._

scala> import TrySugar._
import TrySugar._

scala> import scala.util.Try
import scala.util.Try

scala> def isRound(i: Int): Validation[ErrorMessage] =
    |   if (i % 10 == 0) Pass else Fail(i + " was not a round number")
isRound: (i: Int)org.scalactic.Validation[org.scalactic.ErrorMessage]

Validation will be attempted on a successful Try. If the validation succeeds, the resulting Try will be the same successful Try with the same value. (A "validation" only transforms the Try if the validation fails, otherwise it is the same Try. The only difference is its value has now been proven valid.) In the following example, a successful Try[Int] with the value 100 passes the validation (which checks whether 100 is evenly divisible by 10), therefore the result of the validating call is the same successful Try with the same value.

scala> val try100 = Try(100)
try100: scala.util.Try[Int] = Success(100)

scala> val round100 = try100.validating(isRound)
round100: scala.util.Try[Int] = Success(100)

If validation fails, the successful Try will be transformed into a failed one, with a ValidationFailedException that contains the error message returned by the validation function. In the following example, 42 fails the validation because it is not evenly divisible by 10:

scala> val try42 = Try(42)
try42: scala.util.Try[Int] = Success(42)

scala> val round42 = try42.validating(isRound)
round42: scala.util.Try[Int] = Failure(org.scalactic.exceptions.ValidationFailedException: 42 was not a round number)

If validating is called on a failed Try, it just returns the same failed Try:

scala> val tryEx = Try[Int] { throw new Exception("oops!") }
tryEx: scala.util.Try[Int] = Failure(java.lang.Exception: oops!)

scala> val roundEx = tryEx.validating(isRound)
roundEx: scala.util.Try[Int] = Failure(java.lang.Exception: oops!)

The validating method accepts one or more validation functions. If you pass more than one, they will be tried in order up until the first failure, whose error message will appear in the ValidationFailedException. In other words, validating will short circuit at the first error and return that. It will not accumulate errors. For example, the following validation will short circuit after the isDivBy3 function fails:

scala> def isDivBy3(i: Int): Validation[ErrorMessage] =
    |   if (i % 3 == 0) Pass else Fail(i + " was not divisible by 3")
isDivBy3: (i: Int)org.scalactic.Validation[org.scalactic.ErrorMessage]

scala> def isAnswerToLifeTheUniverseAndEverything(i: Int): Validation[ErrorMessage] =
    |   if (i == 42) Pass else Fail(i + " did not equal 42")
isAnswerToLifeTheUniverseAndEverything: (i: Int)org.scalactic.Validation[org.scalactic.ErrorMessage]

scala> try100.validating(isRound, isDivBy3, isAnswerToLifeTheUniverseAndEverything)
res0: scala.util.Try[Int] = Failure(org.scalactic.exceptions.ValidationFailedException: 100 was not divisible by 3)

Here are some examples of the toOr method:

scala> try100.toOr
res1: org.scalactic.Or[Int,Throwable] = Good(100)

scala> tryEx.toOr
res2: org.scalactic.Or[Int,Throwable] = Bad(java.lang.Exception: oops!)
Companion:
object
Source:
TrySugar.scala
class Object
trait Matchable
class Any
object TrySugar.type

Type members

Classlikes

implicit class Tryizer[T](theTry: Try[T])

Implicit class that adds a toOr method to Try, which converts Success to Good, and Failure to Bad, as well as a validation method, which takes one or more functions that validate the Future's value.

Implicit class that adds a toOr method to Try, which converts Success to Good, and Failure to Bad, as well as a validation method, which takes one or more functions that validate the Future's value.

See the main documentation for trait `TrySugar` for more detail and examples.

Value parameters:
theTry

the Try to which to add toOr and validating methods.

Source:
TrySugar.scala

Implicits

Implicits

final implicit def Tryizer[T](theTry: Try[T]): Tryizer[T]

Implicit class that adds a toOr method to Try, which converts Success to Good, and Failure to Bad, as well as a validation method, which takes one or more functions that validate the Future's value.

Implicit class that adds a toOr method to Try, which converts Success to Good, and Failure to Bad, as well as a validation method, which takes one or more functions that validate the Future's value.

See the main documentation for trait `TrySugar` for more detail and examples.

Value parameters:
theTry

the Try to which to add toOr and validating methods.

Source:
TrySugar.scala