class ParamsReady::Marshaller::InstanceCollection

Attributes

default[R]
instances[R]

Public Class Methods

new(canonical, default = nil, instances = {}) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 9
def initialize(canonical, default = nil, instances = {})
  @canonical = canonical
  @default = default
  @instances = instances
end

Public Instance Methods

add_instance(value_class, instance) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 48
def add_instance(value_class, instance)
  raise ParamsReadyError, "Marshaller must be frozen" unless instance.frozen?

  @instances[value_class] = instance
end
canonicalize(definition, input, context, validator, **opts) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 15
def canonicalize(definition, input, context, validator, **opts)
  value_class = infer_class(input)
  marshaller = instance(value_class)
  raise ParamsReadyError, "Unexpected type for #{definition.name}: #{value_class.name}" if marshaller.nil?

  marshaller.canonicalize(definition, input, context, validator, **opts)
end
default!(value_class) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 69
def default!(value_class)
  instance = instance(value_class)
  raise ParamsReadyError, "No marshaller for class '#{value_class.name}'" if instance.nil?
  self.default = instance
end
default=(instance) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 62
def default=(instance)
  raise ParamsReadyError, "Default already defined" if default?
  raise ParamsReadyError, "Marshaller must be frozen" unless instance.frozen?

  @default = instance
end
default?() click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 75
def default?
  !@default.nil?
end
freeze() click to toggle source
Calls superclass method
# File lib/params_ready/marshaller/collection.rb, line 98
def freeze
  @instance.freeze
  super
end
infer_class(value) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 38
def infer_class(value)
  if instances.key? value.class
    value.class
  elsif value.is_a?(Hash) || Extensions::Hash.acts_as_hash?(value)
    Hash
  else
    value.class
  end
end
instance(value_class) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 54
def instance(value_class)
  @instances[value_class]
end
instance?(value_class) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 58
def instance?(value_class)
  @instances.key?(value_class)
end
marshal(parameter, format, **opts) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 34
def marshal(parameter, format, **opts)
  default.marshal(parameter, format, **opts)
end
marshal_canonical(parameter, format, **opts) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 23
def marshal_canonical(parameter, format, **opts)
  marshaller = instance @canonical
  if marshaller.nil?
    value = parameter.send(:bare_value)
    raise ParamsReadyError, "Value is not canonical" unless value.is_a? @canonical
    value
  else
    marshaller.marshal(parameter, format, **opts)
  end
end
populate_clone(clone, other) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 84
def populate_clone(clone, other)
  if other.default? && !clone.default?
    clone.default = other.default
  end

  other.instances.each do |value_class, i|
    next if clone.instance?(value_class)

    clone.add_instance value_class, i
  end

  clone
end
reverse_merge(other) click to toggle source
# File lib/params_ready/marshaller/collection.rb, line 79
def reverse_merge(other)
  clone = self.class.new(@canonical, @default, @instances.dup)
  populate_clone(clone, other)
end