class FService::Result::Base
Abstract base class for Result::Success
and Result::Failure
.
@abstract
Public Instance Methods
“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
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
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
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
# File lib/f_service/result/base.rb, line 123 def expected_type?(target_types) target_types.include?(type) || target_types.empty? end