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