23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
# File 'lib/active_operation/base.rb', line 23
def from_proc(execute)
Class.new(self) do
positional_arguments = []
keyword_arguments = []
execute.parameters.each do |type, name|
case type
when :req
input name, type: :positional, required: true
positional_arguments << name
when :keyreq
input name, type: :keyword, required: true
keyword_arguments << name
else
raise ArgumentError, "Argument type not supported: #{type}"
end
end
define_method(:execute) do
args = positional_arguments.map { |name| self[name] }
opts = keyword_arguments.map { |name| [name, self[name]] }.to_h
if opts.empty?
execute.call(*args)
else
execute.call(*args, **opts)
end
end
end
end
|