Class: Literal::Lift

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

Instance Method Summary collapse

Constructor Details

#initialize(*required_failure_cases, &block) ⇒ Lift

Returns a new instance of Lift.



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/literal/lift.rb', line 4

def initialize(*required_failure_cases, &block)
	@success_case = nil
	@failure_case = nil

	@required_failure_cases = required_failure_cases
	@handled_failure_cases = {}

	if block.arity == 0
		instance_exec(&block)
	else
		yield(self)
	end

	keys = @handled_failure_cases.keys

	excess_cases = keys - @required_failure_cases
	missing_cases = @required_failure_cases - keys

	if excess_cases.any?
		raise ArgumentError, "Excess case(s): #{excess_cases.map(&:inspect).join(', ')}."
	end

	if missing_cases.any?
		raise ArgumentError, "Missing case(s): #{missing_cases.map(&:inspect).join(', ')}."
	end
end

Instance Method Details

#ensure_failure_case!Object (private)



85
86
87
# File 'lib/literal/lift.rb', line 85

def ensure_failure_case!
	@failure_case ? true : raise(ArgumentError, "You need to define a failure case.")
end

#ensure_success_case!Object (private)



81
82
83
# File 'lib/literal/lift.rb', line 81

def ensure_success_case!
	@success_case ? true : raise(ArgumentError, "You need to define a success case.")
end

#failure(*types, &block) ⇒ Object



69
70
71
72
73
74
75
76
77
# File 'lib/literal/lift.rb', line 69

def failure(*types, &block)
	if types.length == 0
		@failure_case = block
	else
		types.each do |type|
			@handled_failure_cases[type] = block || proc { |it| it }
		end
	end
end

#success(&block) ⇒ Object



65
66
67
# File 'lib/literal/lift.rb', line 65

def success(&block)
	@success_case = block
end

#with_failure(value) ⇒ Object



43
44
45
46
47
48
49
50
51
# File 'lib/literal/lift.rb', line 43

def with_failure(value)
	ensure_success_case! and ensure_failure_case!

	@handled_failure_cases.each do |condition, block|
		return block.call(value) if condition === value
	end

	@failure_case.call(value)
end

#with_failure!(value) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/literal/lift.rb', line 53

def with_failure!(value)
	ensure_success_case!

	@handled_failure_cases.each do |condition, block|
		return block.call(value) if condition === value
	end

	return @failure_case.call(value) if @failure_case

	raise(value)
end

#with_success(value) ⇒ Object



31
32
33
34
35
# File 'lib/literal/lift.rb', line 31

def with_success(value)
	ensure_success_case! and ensure_failure_case!

	@success_case.call(value)
end

#with_success!(value) ⇒ Object



37
38
39
40
41
# File 'lib/literal/lift.rb', line 37

def with_success!(value)
	ensure_success_case!

	@success_case.call(value)
end