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