class Puppet::Pops::Serialization::AbstractReader
Abstract class for protocol specific readers such as MsgPack or JSON The abstract reader is capable of reading the primitive scalars:
-
Boolean
-
Integer
-
Float
-
String
and, by using extensions, also
-
Array start
-
Map start
-
Objectstart -
Regexp
-
Version
-
VersionRange
-
Timespan
-
Timestamp
-
Default
@api public
Public Class Methods
@param [MessagePack::Unpacker,JSON::Unpacker] unpacker The low lever unpacker that delivers the primitive objects @param [MessagePack::Unpacker,JSON::Unpacker] extension_unpacker Optional unpacker for extensions. Defaults to the unpacker @api public
# File lib/puppet/pops/serialization/abstract_reader.rb 29 def initialize(unpacker, extension_unpacker = nil) 30 @read = [] 31 @unpacker = unpacker 32 @extension_unpacker = extension_unpacker.nil? ? unpacker : extension_unpacker 33 register_types 34 end
Public Instance Methods
@api private
# File lib/puppet/pops/serialization/abstract_reader.rb 82 def extension_unpacker 83 @extension_unpacker 84 end
@return [Integer] The total count of unique primitive values that has been read @api private
# File lib/puppet/pops/serialization/abstract_reader.rb 55 def primitive_count 56 @read.size 57 end
Read an object from the underlying unpacker @return [Object] the object that was read @api public
# File lib/puppet/pops/serialization/abstract_reader.rb 39 def read 40 obj = @unpacker.read 41 case obj 42 when Extension::InnerTabulation 43 @read[obj.index] 44 when Numeric, Symbol, Extension::NotTabulated, true, false, nil 45 # not tabulated 46 obj 47 else 48 @read << obj 49 obj 50 end 51 end
@api private
# File lib/puppet/pops/serialization/abstract_reader.rb 60 def read_payload(data) 61 raise SerializationError, "Internal error: Class #{self.class} does not implement method 'read_payload'" 62 end
@api private
# File lib/puppet/pops/serialization/abstract_reader.rb 70 def read_tpl(ep) 71 obj = ep.read 72 case obj 73 when Integer 74 @read[obj] 75 else 76 @read << obj 77 obj 78 end 79 end
@api private
# File lib/puppet/pops/serialization/abstract_reader.rb 65 def read_tpl_qname(ep) 66 Array.new(ep.read) { read_tpl(ep) }.join('::') 67 end
@api private
# File lib/puppet/pops/serialization/abstract_reader.rb 87 def register_type(extension_number, &block) 88 @unpacker.register_type(extension_number, &block) 89 end
@api private
# File lib/puppet/pops/serialization/abstract_reader.rb 92 def register_types 93 register_type(Extension::INNER_TABULATION) do |data| 94 read_payload(data) { |ep| Extension::InnerTabulation.new(ep.read) } 95 end 96 97 register_type(Extension::TABULATION) do |data| 98 read_payload(data) { |ep| Extension::Tabulation.new(ep.read) } 99 end 100 101 register_type(Extension::ARRAY_START) do |data| 102 read_payload(data) { |ep| Extension::ArrayStart.new(ep.read) } 103 end 104 105 register_type(Extension::MAP_START) do |data| 106 read_payload(data) { |ep| Extension::MapStart.new(ep.read) } 107 end 108 109 register_type(Extension::PCORE_OBJECT_START) do |data| 110 read_payload(data) { |ep| type_name = read_tpl_qname(ep); Extension::PcoreObjectStart.new(type_name, ep.read) } 111 end 112 113 register_type(Extension::OBJECT_START) do |data| 114 read_payload(data) { |ep| Extension::ObjectStart.new(ep.read) } 115 end 116 117 register_type(Extension::DEFAULT) do |data| 118 read_payload(data) { |ep| Extension::Default::INSTANCE } 119 end 120 121 register_type(Extension::COMMENT) do |data| 122 read_payload(data) { |ep| Extension::Comment.new(ep.read) } 123 end 124 125 register_type(Extension::SENSITIVE_START) do |data| 126 read_payload(data) { |ep| Extension::SensitiveStart::INSTANCE } 127 end 128 129 register_type(Extension::REGEXP) do |data| 130 read_payload(data) { |ep| Regexp.new(ep.read) } 131 end 132 133 register_type(Extension::TYPE_REFERENCE) do |data| 134 read_payload(data) { |ep| Types::PTypeReferenceType.new(ep.read) } 135 end 136 137 register_type(Extension::SYMBOL) do |data| 138 read_payload(data) { |ep| ep.read.to_sym } 139 end 140 141 register_type(Extension::TIME) do |data| 142 read_payload(data) do |ep| 143 sec = ep.read 144 nsec = ep.read 145 Time::Timestamp.new(sec * 1000000000 + nsec) 146 end 147 end 148 149 register_type(Extension::TIMESPAN) do |data| 150 read_payload(data) do |ep| 151 sec = ep.read 152 nsec = ep.read 153 Time::Timespan.new(sec * 1000000000 + nsec) 154 end 155 end 156 157 register_type(Extension::VERSION) do |data| 158 read_payload(data) { |ep| SemanticPuppet::Version.parse(ep.read) } 159 end 160 161 register_type(Extension::VERSION_RANGE) do |data| 162 read_payload(data) { |ep| SemanticPuppet::VersionRange.parse(ep.read) } 163 end 164 165 register_type(Extension::BASE64) do |data| 166 read_payload(data) { |ep| Types::PBinaryType::Binary.from_base64_strict(ep.read) } 167 end 168 169 register_type(Extension::BINARY) do |data| 170 # The Ruby MessagePack implementation have special treatment for "ASCII-8BIT" strings. They 171 # are written as binary data. 172 read_payload(data) { |ep| Types::PBinaryType::Binary.new(ep.read) } 173 end 174 175 register_type(Extension::URI) do |data| 176 read_payload(data) { |ep| URI(ep.read) } 177 end 178 end