Class: Literal::ResultHandler

Inherits:
Object
  • Object
show all
Defined in:
lib/literal/result_handler.rb

Instance Method Summary collapse

Constructor Details

#initialize(result) ⇒ ResultHandler



4
5
6
7
8
# File 'lib/literal/result_handler.rb', line 4

def initialize(result)
  @result = result
  @success_cases = []
  @failure_cases = []
end

Instance Method Details

#failure(type = Literal::Types::_Any?, &block) ⇒ Object



45
46
47
# File 'lib/literal/result_handler.rb', line 45

def failure(type = Literal::Types::_Any?, &block)
  @failure_cases << [type, block]
end

#handle {|_self| ... } ⇒ Object

Yields:

  • (_self)

Yield Parameters:

Raises:



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/literal/result_handler.rb', line 10

def handle
  return @result unless block_given?

  yield(self)

  unless Literal.subtype?(@result.success_type, covered_type(@success_cases))
    raise Literal::ArgumentError.new("No success handler covers #{@result.success_type.inspect}")
  end

  unless Literal.subtype?(@result.failure_type, covered_type(@failure_cases))
    raise Literal::ArgumentError.new("No failure handler covers #{@result.failure_type.inspect}")
  end

  case @result
  when Literal::Success
    @success_cases.each do |type, block|
      if type === @result.value!
        return block&.call(@result.value!)
      end
    end
  when Literal::Failure
    @failure_cases.each do |type, block|
      if type === @result.error!
        return block&.call(@result.error!)
      end
    end
  end

  raise Literal::ArgumentError.new("Unhandled result type: #{@result.class}")
end

#success(type = Literal::Types::_Any?, &block) ⇒ Object



41
42
43
# File 'lib/literal/result_handler.rb', line 41

def success(type = Literal::Types::_Any?, &block)
  @success_cases << [type, block]
end