class Puppet::Pops::Serialization::JSON::Unpacker

Public Class Methods

new(io) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
243 def initialize(io)
244   re_initialize(io)
245   @type_registry = {}
246   @nested = []
247 end

Public Instance Methods

re_initialize(io) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
249 def re_initialize(io)
250   parsed = parse_io(io)
251   raise SerializationError, _("JSON stream is not an array. It is a %{klass}") % { klass: io.class.name } unless parsed.is_a?(Array)
252   @etor_stack = [parsed.each]
253 end
read() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
255 def read
256   obj = nil
257   loop do
258     raise SerializationError, _('Unexpected end of input') if @etor_stack.empty?
259     etor = @etor_stack.last
260     begin
261       obj = etor.next
262       break
263     rescue StopIteration
264       @etor_stack.pop
265     end
266   end
267   if obj.is_a?(Array)
268     ext_etor = obj.each
269     @etor_stack << ext_etor
270     ext_no = ext_etor.next
271     ext_block = @type_registry[ext_no]
272     raise SerializationError, _("Invalid input. %{ext_no} is not a valid extension number") % { ext_no: ext_no } if ext_block.nil?
273     obj = ext_block.call(nil)
274   end
275   obj
276 end
register_type(extension_number, &block) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
278 def register_type(extension_number, &block)
279   @type_registry[extension_number] = block
280 end

Private Instance Methods

parse_io(io) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
284 def parse_io(io)
285   case io
286   when IO, StringIO
287     ::Puppet::Util::Json.load(io.read)
288   when String
289     ::Puppet::Util::Json.load(io)
290   else
291     io
292   end
293 end