Class: GitHub::Result

Inherits:
Object
  • Object
show all
Defined in:
lib/github/result.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeResult

Invokes the supplied block and wraps the return value in a GitHub::Result object.

Exceptions raised by the block are caught and also wrapped.

Example:

GitHub::Result.new { 123 }
  # => #<GitHub::Result value: 123>

GitHub::Result.new { raise "oops" }
  # => #<GitHub::Result error: #<RuntimeError: oops>>


16
17
18
19
20
21
22
23
# File 'lib/github/result.rb', line 16

def initialize
  begin
    @value = yield if block_given?
    @error = nil
  rescue => e
    @error = e
  end
end

Class Method Details

.error(e) ⇒ Object

Create a GitHub::Result with only the error condition set.

GitHub::Result.error(e)
 # => # <GitHub::Result error: ...>


223
224
225
226
227
# File 'lib/github/result.rb', line 223

def self.error(e)
  result = allocate
  result.instance_variable_set(:@error, e)
  result
end

Instance Method Details

#errorObject

If the result represents a value, returns nil.

If the result represents an error, returns that error.

result = do_something()
  # => #<GitHub::Result value: "foo">

result.error
  # => nil

result = do_something_that_fails()
  # => #<GitHub::Result error: ...>

result.error
  # => ...


214
215
216
# File 'lib/github/result.rb', line 214

def error
  @error
end

#mapObject

If the result represents a value, invokes the supplied block with that value and wraps the block’s return value in a GitHub::Result.

If the result represents an error, returns self.

The block should not return a GitHub::Result object (unless you truly intend to create a GitHub::Result<GitHub::Result<T>>). Use #then if it does.

Example:

result = do_something()
  # => #<GitHub::Result value: 123>

result.map { |val| val * 2 }
  # => #<GitHub::Result value: 246>

do_something_that_fails().map { |val|
  # never invoked
}
  # => #<GitHub::Result error: ...>


113
114
115
116
117
118
119
# File 'lib/github/result.rb', line 113

def map
  if ok?
    Result.new { yield(@value) }
  else
    self
  end
end

#ok?Boolean

Returns true if the result represents a value, false if an error.

Example:

result = do_something()
  # => #<GitHub::Result value: "foo">

result.ok?
  # => true

result = do_something_that_fails()
  # => #<GitHub::Result error: ...>

result.ok?
  # => false

Returns:

  • (Boolean)


194
195
196
# File 'lib/github/result.rb', line 194

def ok?
  !@error
end

#rescueObject

If the result represents an error, invokes the supplied block with that error.

If the result represents a value, returns self.

The block must also return a GitHub::Result object. Use #map otherwise.

Example:

result = do_something().rescue { |val|
  # never invoked
}
  # => #<GitHub::Result value: ...>

do_something_that_fails().rescue { |val|
  # handle_error(val)
}
  # => #<GitHub::Result error: ...>

Raises:

  • (TypeError)


84
85
86
87
88
89
# File 'lib/github/result.rb', line 84

def rescue
  return self if ok?
  result = yield(@error)
  raise TypeError, "block invoked in GitHub::Result#rescue did not return GitHub::Result" unless result.is_a?(Result)
  result
end

#thenObject

If the result represents a value, invokes the supplied block with that value.

If the result represents an error, returns self.

The block must also return a GitHub::Result object. Use #map otherwise.

Example:

result = do_something().then { |val|
  do_other_thing(val)
}
  # => #<GitHub::Result value: ...>

do_something_that_fails().then { |val|
  # never invoked
}
  # => #<GitHub::Result error: ...>


55
56
57
58
59
60
61
62
63
# File 'lib/github/result.rb', line 55

def then
  if ok?
    result = yield(@value)
    raise TypeError, "block invoked in GitHub::Result#then did not return GitHub::Result" unless result.is_a?(Result)
    result
  else
    self
  end
end

#to_sObject Also known as: inspect



25
26
27
28
29
30
31
# File 'lib/github/result.rb', line 25

def to_s
  if ok?
    "#<GitHub::Result:0x%x value: %s>" % [object_id, @value.inspect]
  else
    "#<GitHub::Result:0x%x error: %s>" % [object_id, @error.inspect]
  end
end

#valueObject

If the result represents a value, returns that value.

If the result represents an error, invokes the supplied block with the exception object.

Example:

result = do_something()
  # => #<GitHub::Result value: "foo">

result.value { "nope" }
  # => "foo"

result = do_something_that_fails()
  # => #<GitHub::Result error: ...>

result.value { "nope" }
  # => #<GitHub::Result value: "nope">


140
141
142
143
144
145
146
147
148
149
150
# File 'lib/github/result.rb', line 140

def value
  unless block_given?
    raise ArgumentError, "must provide a block to GitHub::Result#value to be invoked in case of error"
  end

  if ok?
    @value
  else
    yield(@error)
  end
end

#value!Object

If the result represents a value, returns that value.

If the result represents an error, raises that error.

Example:

result = do_something()
  # => #<GitHub::Result value: "foo">

result.value!
  # => "foo"

result = do_something_that_fails()
  # => #<GitHub::Result error: ...>

result.value!
  # !! raises exception


170
171
172
173
174
175
176
# File 'lib/github/result.rb', line 170

def value!
  if ok?
    @value
  else
    raise @error
  end
end