Module: Axn::Internal::Callable

Extended by:
Callable
Included in:
Callable
Defined in:
lib/axn/internal/callable.rb

Instance Method Summary collapse

Instance Method Details

#call_with_desired_shape(callable, args: [], kwargs: {}) ⇒ Object

Calls a callable with only the positional and keyword arguments it expects. If the callable accepts **kwargs (keyrest), passes all provided kwargs. If the callable accepts *args (rest), passes all provided positional args.

Calls a callable with only the positional and keyword arguments it expects.

Examples:

proc = ->(resource:, result:) { }
Callable.call_with_desired_shape(proc, kwargs: { resource: "Action", result: result, extra: "ignored" })
# Calls proc with only resource: and result:
proc = ->(a, b, c:) { }
Callable.call_with_desired_shape(proc, args: [1, 2, 3, 4], kwargs: { c: 5, d: 6 })
# Calls proc with args [1, 2, 3] and kwargs { c: 5 }
proc = ->(**kwargs) { }
Callable.call_with_desired_shape(proc, kwargs: { resource: "Action", result: result })
# Calls proc with all kwargs

Parameters:

  • callable (Proc, Method, #call)

    A callable object

  • args (Array) (defaults to: [])

    An array of positional arguments to potentially pass

  • kwargs (Hash) (defaults to: {})

    A hash of keyword arguments to potentially pass

Returns:

  • The return value of calling the callable



32
33
34
35
# File 'lib/axn/internal/callable.rb', line 32

def call_with_desired_shape(callable, args: [], kwargs: {})
  filtered_args, filtered_kwargs = only_requested_params(callable, args:, kwargs:)
  callable.call(*filtered_args, **filtered_kwargs)
end

#only_requested_params(callable, args: [], kwargs: {}) ⇒ Array<Array, Hash>

Returns filtered args and kwargs for a callable without calling it. Useful when you need to execute the callable in a specific context (e.g., via instance_exec).

Examples:

proc = ->(resource:, result:) { }
args, kwargs = Callable.only_requested_params(proc, kwargs: { resource: "Action", result: result, extra: "ignored" })
# => [[], { resource: "Action", result: result }]
action.instance_exec(*args, **kwargs, &proc)

Parameters:

  • callable (Proc, Method, #parameters)

    A callable object

  • args (Array) (defaults to: [])

    An array of positional arguments to potentially pass

  • kwargs (Hash) (defaults to: {})

    A hash of keyword arguments to potentially pass

Returns:

  • (Array<Array, Hash>)

    A tuple of [filtered_args, filtered_kwargs]



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/axn/internal/callable.rb', line 50

def only_requested_params(callable, args: [], kwargs: {})
  return [args, kwargs] unless callable.respond_to?(:parameters)

  params = callable.parameters

  # Determine which positional arguments to pass
  filtered_args = filter_positional_args(params, args)

  # Determine which keyword arguments to pass
  filtered_kwargs = filter_kwargs(params, kwargs)

  [filtered_args, filtered_kwargs]
end

#only_requested_params_for_exception(callable, exception) ⇒ Array<Array, Hash>

Returns filtered args and kwargs for a callable when passing an exception. The exception will be passed as either a positional argument or keyword argument, depending on what the callable expects.

Examples:

proc = ->(exception:) { }
args, kwargs = Callable.only_requested_params_for_exception(proc, exception)
# => [[], { exception: exception }]
action.instance_exec(*args, **kwargs, &proc)
proc = ->(exception) { }
args, kwargs = Callable.only_requested_params_for_exception(proc, exception)
# => [[exception], {}]
action.instance_exec(*args, **kwargs, &proc)

Parameters:

  • callable (Proc, Method, #parameters)

    A callable object

  • exception (Exception, nil)

    The exception to potentially pass

Returns:

  • (Array<Array, Hash>)

    A tuple of [filtered_args, filtered_kwargs]



83
84
85
86
87
88
89
# File 'lib/axn/internal/callable.rb', line 83

def only_requested_params_for_exception(callable, exception)
  return [[], {}] unless exception

  args = [exception]
  kwargs = { exception: }
  only_requested_params(callable, args:, kwargs:)
end