class FService::Result::Base

Abstract base class for Result::Success and Result::Failure.

@abstract

Public Instance Methods

on(success:, failure:) click to toggle source

“Pattern matching”-like method for results. It will run the success path if Result is a Success. Otherwise, it will run the failure path.

@example

class UsersController < BaseController
  def update
    User::Update.(user: user).on(
      success: ->(value) { return json_success(value) },
      failure: ->(error) { return json_error(error) }
    )
  end

  private

  def user
    @user ||= User.find_by!(slug: params[:slug])
  end
end

@param success [#call] a lambda (or anything that responds to call) to run on success @param failure [#call] a lambda (or anything that responds to call) to run on failure @deprecated Use {#on_success} and/or {#on_failure} instead. @api public

# File lib/f_service/result/base.rb, line 41
def on(success:, failure:)
  FService.deprecate!(
    name: "#{self.class}##{__method__}",
    alternative: '#on_success and/or #on_failure'
  )

  if successful?
    success.call(value)
  else
    failure.call(error)
  end
end
on_failure(*target_types) { |*to_ary| ... } click to toggle source

This hook runs if the result is failed. Can receive one or more types to be checked before running the given block.

@example

class UsersController < BaseController
  def update
    User::Update.(user: user)
                .on_success { |value| return json_success(value) } # this won't run
                .on_failure(:type, :type2) { |error| return json_error(error) } # runs only if type matches
                .on_failure { |error| return json_error(error) }
  end

  private

  def user
    @user ||= User.find_by!(slug: params[:slug])
  end
end

@yieldparam value value of the failure object @yieldparam type type of the failure object @return [Success, Failure] the original Result object @api public

# File lib/f_service/result/base.rb, line 106
def on_failure(*target_types)
  yield(*to_ary) if failed? && expected_type?(target_types)

  self
end
on_success(*target_types) { |*to_ary| ... } click to toggle source

This hook runs if the result is successful. Can receive one or more types to be checked before running the given block.

@example

class UsersController < BaseController
  def update
    User::Update.(user: user)
                .on_success(:type, :type2) { return json_success({ status: :ok }) } # run only if type matches
                .on_success { |value| return json_success(value) }
                .on_failure { |error| return json_error(error) } # this won't run
  end

  private

  def user
    @user ||= User.find_by!(slug: params[:slug])
  end
end

@yieldparam value value of the failure object @yieldparam type type of the failure object @return [Success, Failure] the original Result object @api public

# File lib/f_service/result/base.rb, line 77
def on_success(*target_types)
  yield(*to_ary) if successful? && expected_type?(target_types)

  self
end
to_ary() click to toggle source

Splits the result object into its components.

@return [Array] value and type of the result object

# File lib/f_service/result/base.rb, line 115
def to_ary
  data = successful? ? value : error

  [data, type]
end

Private Instance Methods

expected_type?(target_types) click to toggle source
# File lib/f_service/result/base.rb, line 123
def expected_type?(target_types)
  target_types.include?(type) || target_types.empty?
end