lib/datacaster/switch_node.rb in datacaster-3.2.2 vs lib/datacaster/switch_node.rb in datacaster-3.2.3
- old
+ new
@@ -1,13 +1,17 @@
module Datacaster
class SwitchNode < Base
- def initialize(base = nil, on_casters = [], else_caster = nil)
+ def initialize(base = nil, on_casters: [], else_caster: nil, pick_key: nil)
@base = base
+ @pick_key = pick_key
if Datacaster::Utils.pickable?(@base)
- @base = Datacaster::Predefined.run { checked_key!(base) } &
- Datacaster::Predefined.pick(base)
+ unless @pick_key.nil?
+ raise RuntimeError, "pick_key expected to be nil because #{@base.inspect} is pickable"
+ end
+ @pick_key = base
+ @base = Datacaster::Predefined.pick(base)
end
if !@base.nil? && !Datacaster.instance?(@base)
raise RuntimeError, "provide a Datacaster::Base instance, a hash key, or an array of keys to switch(...) caster", caller
end
@@ -32,16 +36,16 @@
Datacaster::Predefined.compare(caster_or_value)
end
clause = DefinitionDSL.expand(clause)
- self.class.new(@base, @ons + [[caster, clause]], @else)
+ self.class.new(@base, on_casters: @ons + [[caster, clause]], else_caster: @else, pick_key: @pick_key)
end
def else(else_caster)
raise ArgumentError, "Datacaster: double else clause is not permitted", caller if @else
- self.class.new(@base, @ons, else_caster)
+ self.class.new(@base, on_casters: @ons, else_caster: else_caster, pick_key: @pick_key)
end
def cast(object, runtime:)
if @ons.empty?
raise RuntimeError, "switch caster requires at least one 'on' statement: switch(...).on(condition, cast)", caller
@@ -57,11 +61,15 @@
@ons.each do |check, clause|
result = check.with_runtime(runtime).(switch_result)
next unless result.valid?
- return clause.with_runtime(runtime).(object)
+ if @pick_key.nil?
+ return clause.with_runtime(runtime).(object)
+ else
+ return runtime.checked_key!(@pick_key) { clause.with_runtime(runtime).(object) }
+ end
end
# all 'on'-s have failed
return @else.with_runtime(runtime).(object) if @else
@@ -69,9 +77,9 @@
I18nValues::Key.new(['.switch', 'datacaster.errors.switch'], value: object)
)
end
def inspect
- "#<Datacaster::SwitchNode base: #{@base.inspect} on: #{@ons.inspect} else: #{@else.inspect}>"
+ "#<Datacaster::SwitchNode base: #{@base.inspect} on: #{@ons.inspect} else: #{@else.inspect} pick_key: #{@pick_key.inspect}>"
end
end
end