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
13 def read(type, impl_class, value_count, deserializer)
14   (names, types, required_count) = type.parameter_info(impl_class)
15   max = names.size
16   unless value_count >= required_count && value_count <= max
17     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 }
18   end
19   # Deserializer must know about this instance before we read its attributes
20   val = deserializer.remember(impl_class.allocate)
21   args = Array.new(value_count) { deserializer.read }
22   types.each_with_index do |ptype, index|
23     if index < args.size
24       arg = args[index]
25       Types::TypeAsserter.assert_instance_of(nil, ptype, arg) { "#{type.name}[#{names[index]}]" } unless arg == :default
26     else
27       attr = type[names[index]]
28       raise Serialization::SerializationError, _("Missing default value for %{type_name}[%{name}]") % { type_name: type.name, name: names[index] } unless attr && attr.value?
29       args << attr.value
30     end
31   end
32   val.send(:initialize, *args)
33   val
34 end