Trait/Object

org.scalactic

TrySugar

Related Docs: object TrySugar | package scalactic

Permalink

trait TrySugar extends AnyRef

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 Pass). If the value does not pass this test, the result is a Fail 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!)

Source
TrySugar.scala
Linear Supertypes
AnyRef, Any
Known Subclasses
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. TrySugar
  2. AnyRef
  3. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Type Members

  1. implicit class Tryizer[T] extends AnyRef

    Permalink

    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 Members

  1. final def !=(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  2. final def ##(): Int

    Permalink
    Definition Classes
    AnyRef → Any
  3. final def ==(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  4. final def asInstanceOf[T0]: T0

    Permalink
    Definition Classes
    Any
  5. def clone(): AnyRef

    Permalink
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  6. final def eq(arg0: AnyRef): Boolean

    Permalink
    Definition Classes
    AnyRef
  7. def equals(arg0: Any): Boolean

    Permalink
    Definition Classes
    AnyRef → Any
  8. def finalize(): Unit

    Permalink
    Attributes
    protected[java.lang]
    Definition Classes
    AnyRef
    Annotations
    @throws( classOf[java.lang.Throwable] )
  9. final def getClass(): Class[_]

    Permalink
    Definition Classes
    AnyRef → Any
  10. def hashCode(): Int

    Permalink
    Definition Classes
    AnyRef → Any
  11. final def isInstanceOf[T0]: Boolean

    Permalink
    Definition Classes
    Any
  12. final def ne(arg0: AnyRef): Boolean

    Permalink
    Definition Classes
    AnyRef
  13. final def notify(): Unit

    Permalink
    Definition Classes
    AnyRef
  14. final def notifyAll(): Unit

    Permalink
    Definition Classes
    AnyRef
  15. final def synchronized[T0](arg0: ⇒ T0): T0

    Permalink
    Definition Classes
    AnyRef
  16. def toString(): String

    Permalink
    Definition Classes
    AnyRef → Any
  17. final def wait(): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  18. final def wait(arg0: Long, arg1: Int): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )
  19. final def wait(arg0: Long): Unit

    Permalink
    Definition Classes
    AnyRef
    Annotations
    @throws( ... )

Inherited from AnyRef

Inherited from Any

Ungrouped