class Puppet::Pops::Serialization::ObjectReader

Instance reader for objects that implement {Types::PuppetObject} @api private

Constants

INSTANCE

Public Instance Methods

read(type, impl_class, value_count, deserializer) click to toggle source
   # File lib/puppet/pops/serialization/object.rb
12 def read(type, impl_class, value_count, deserializer)
13   (names, types, required_count) = type.parameter_info(impl_class)
14   max = names.size
15   unless value_count >= required_count && value_count <= max
16     raise Serialization::SerializationError, _("Feature count mismatch for %{value0}. Expected %{required_count} - %{max}, actual %{value_count}") % { value0: impl_class.name, required_count: required_count, max: max, value_count: value_count }
17   end
18   # Deserializer must know about this instance before we read its attributes
19   val = deserializer.remember(impl_class.allocate)
20   args = Array.new(value_count) { deserializer.read }
21   types.each_with_index do |ptype, index|
22     if index < args.size
23       arg = args[index]
24       Types::TypeAsserter.assert_instance_of(nil, ptype, arg) { "#{type.name}[#{names[index]}]" } unless arg == :default
25     else
26       attr = type[names[index]]
27       raise Serialization::SerializationError, _("Missing default value for %{type_name}[%{name}]") % { type_name: type.name, name: names[index] } unless attr && attr.value?
28       args << attr.value
29     end
30   end
31   val.send(:initialize, *args)
32   val
33 end