class Errant::Result

Constants

DEFAULT_EXCEPTIONS

Attributes

exceptions[R]

Public Class Methods

new(*exceptions, &blk) click to toggle source
# File lib/errant/result.rb, line 7
def initialize(*exceptions, &blk)
  if exceptions.length == 0
    @exceptions = DEFAULT_EXCEPTIONS
  else
    @exceptions = exceptions
  end
end

Public Instance Methods

flatten(limit = nil) click to toggle source

This is the most complex logic for dealing with Errant objects. It is intended to flatten a series of Result objects into a single, logical Result:

Success[Success[Success[3]]].flatten => Success[3]
Success[Success[Success[3]]].flatten(1) => Success[Success[3]]
Failure[Failure[e]].flatten => Failure[e]

However, there is one more complex rule: we never want to collapse a Failure into a Success.

Success[Failure[e]].flatten => Failure[e]
Success[Failure[Success[3]]].flatten = Failure[Success[3]]

Recursion would make this relatively easy, but is risky on MRI.

# File lib/errant/result.rb, line 30
def flatten(limit = nil)
  return self unless value.is_a?(Result)
  return self if self.is_a?(Failure) && value.is_a?(Success)

  limit = 0 if !limit.nil? && limit < 0

  current_value = value

  while current_value.is_a?(Result) && (limit.nil? || limit > 0) do
    previous_value = current_value
    current_value = previous_value.value
    limit -= 1 unless limit.nil?
    break if current_value.is_a?(Success) && previous_value.is_a?(Failure)
  end

  previous_value.nil? ? current_value : previous_value
end