Sha256: 6e9f3ae0fed7c94f5e14f3c86bdfa997cb4745fadc507b761ca47c0c4a6dc659

Contents?: true

Size: 1.09 KB

Versions: 1

Compression:

Stored size: 1.09 KB

Contents

# frozen_string_literal: true
require "forwardable"

require_relative "safe_operation/version"
require_relative "safe_operation/success"
require_relative "safe_operation/failure"

class SafeOperation
  extend Forwardable

  class << self
    protected(:new)

    def run
      success(yield)
    rescue StandardError => exception
      failure(exception)
    end

    def success(value)
      new(success: value)
    end

    def failure(value)
      new(failure: value)
    end
  end

  def_delegators :@result, :success?, :value

  def initialize(success: nil, failure: nil)
    @result = success ? Success.new(success) : Failure.new(failure)
  end

  def value_or(fallback_value)
    if success?
      value
    else
      fallback_value
    end
  end

  def value_or_else(&fallback_block)
    if success?
      value
    else
      fallback_block.call(value)
    end
  end

  def and_then(&block)
    if success?
      self.class.success(block.call(value))
    else
      self
    end
  end

  def or_else(&block)
    if success?
      self
    else
      self.class.failure(block.call(value))
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
safe_operation-2.0.0 lib/safe_operation.rb