Sha256: 1e5a49ad9dd31ae3f33239a4f924702ff2aef96bbae2adb283cb2580820278ec

Contents?: true

Size: 1.24 KB

Versions: 2

Compression:

Stored size: 1.24 KB

Contents

# frozen_string_literal: true

class BCDD::Result
  module Context::CallableAndThen
    class Caller < CallableAndThen::Caller
      module KeyArgs
        def self.parameters?(source)
          parameters = source.parameters.map(&:first)

          !parameters.empty? && parameters.all?(/\Akey/)
        end

        def self.invalid_arity(source, method)
          CallableAndThen::Error::InvalidArity.build(source: source, method: method, arity: 'only keyword args')
        end
      end

      def self.call_proc!(source, value, _injected_value)
        return source.call(**value) if KeyArgs.parameters?(source)

        raise KeyArgs.invalid_arity(source, :call)
      end

      def self.call_method!(source, method, value, _injected_value)
        return source.send(method.name, **value) if KeyArgs.parameters?(method)

        raise KeyArgs.invalid_arity(source, method.name)
      end

      def self.ensure_result_object(source, value, result)
        return result.tap { result.send(:acc).then { _1.merge!(value.merge(_1)) } } if result.is_a?(Context)

        raise Error::UnexpectedOutcome.build(outcome: result, origin: source, expected: Context::EXPECTED_OUTCOME)
      end

      private_class_method :call_proc!, :call_method!
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
bcdd-result-0.13.0 lib/bcdd/result/context/callable_and_then.rb
bcdd-result-0.12.0 lib/bcdd/result/context/callable_and_then.rb