22
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
|
# File 'lib/igniter/extensions/contracts/language/scale_pack.rb', line 22
def scale_keyword
Igniter::Contracts::DslKeyword.new(:scale) do |name, from:, builder:, trace: nil, &block|
raise ArgumentError, "scale :#{name} requires a block" unless block
source_name = from.to_sym
trace_name = (trace || :"#{name}_trace").to_sym
definition = Definition.new(name: name, source_name: source_name)
definition.instance_eval(&block)
definition.validate!
builder.add_operation(
kind: :compute,
name: trace_name,
depends_on: [source_name],
callable: lambda do |**values|
definition.resolve(values.fetch(source_name))
end
)
builder.add_operation(
kind: :compute,
name: name,
depends_on: [trace_name],
callable: lambda do |**values|
values.fetch(trace_name).fetch(:value)
end
)
end
end
|