class GitHub::Result

Public Class Methods

error(e) click to toggle source

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

GitHub::Result.error(e)
 # => # <GitHub::Result error: ...>
# File lib/github/result.rb, line 223
def self.error(e)
  result = allocate
  result.instance_variable_set(:@error, e)
  result
end
new() { || ... } click to toggle source

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>>
# File lib/github/result.rb, line 16
def initialize
  begin
    @value = yield if block_given?
    @error = nil
  rescue => e
    @error = e
  end
end

Public Instance Methods

error() click to toggle source

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
  # => ...
# File lib/github/result.rb, line 214
def error
  @error
end
inspect()
Alias for: to_s
map() { |value| ... } click to toggle source

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: ...>
# File lib/github/result.rb, line 113
def map
  if ok?
    Result.new { yield(@value) }
  else
    self
  end
end
ok?() click to toggle source

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
# File lib/github/result.rb, line 194
def ok?
  !@error
end
rescue() { |error| ... } click to toggle source

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: ...>
# 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
then() { |value| ... } click to toggle source

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: ...>
# 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_s() click to toggle source
# 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
Also aliased as: inspect
value() { |error| ... } click to toggle source

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">
# 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!() click to toggle source

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
# File lib/github/result.rb, line 170
def value!
  if ok?
    @value
  else
    raise @error
  end
end