class Puppet::Pops::Serialization::JSON::Packer

The JSON Packer. Modeled after the MessagePack::Packer @api private

Public Class Methods

new(io, options = {}) click to toggle source
   # File lib/puppet/pops/serialization/json.rb
66 def initialize(io, options = {})
67   @io = io
68   @io << '['
69   @type_registry = {}
70   @nested = []
71   @verbose = options[:verbose]
72   @verbose = false if @verbose.nil?
73   @indent = options[:indent] || 0
74 end

Public Instance Methods

clear_io() click to toggle source
   # File lib/puppet/pops/serialization/json.rb
80 def clear_io
81   # Truncate everything except leading '['
82   if @io.is_a?(String)
83     @io.slice!(1..-1)
84   else
85     @io.truncate(1)
86   end
87 end
empty?() click to toggle source
   # File lib/puppet/pops/serialization/json.rb
89 def empty?
90   @io.is_a?(String) ? io.length == 1 : @io.pos == 1
91 end
flush() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
 93 def flush
 94   # Drop last comma unless just start marker present
 95   if @io.is_a?(String)
 96     @io.chop! unless @io.length == 1
 97     @io << ']'
 98   else
 99     pos = @io.pos
100     @io.pos = pos - 1 unless pos == 1
101     @io << ']'
102     @io.flush
103   end
104 end
pack(obj)
Alias for: write
register_type(type, klass, &block) click to toggle source
   # File lib/puppet/pops/serialization/json.rb
76 def register_type(type, klass, &block)
77   @type_registry[klass] = [type, klass, block]
78 end
to_a() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
149 def to_a
150   ::Puppet::Util::Json.load(io_string)
151 end
to_json() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
153 def to_json
154   if @indent > 0
155     ::Puppet::Util::Json.dump(to_a, { :pretty => true, :indent => ' ' * @indent })
156   else
157     io_string
158   end
159 end
to_s() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
145 def to_s
146   to_json
147 end
write(obj) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
106 def write(obj)
107   case obj
108   when Array
109     write_array_header(obj.size)
110     obj.each { |x| write(x) }
111   when Hash
112     write_map_header(obj.size)
113     obj.each_pair {|k, v| write(k); write(v) }
114   when nil
115     write_nil
116   else
117     write_scalar(obj)
118   end
119 end
Also aliased as: pack
write_array_header(n) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
122 def write_array_header(n)
123   if n < 1
124     @io << '[]'
125   else
126     @io << '['
127     @nested <<  [false, n]
128   end
129 end
write_map_header(n) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
131 def write_map_header(n)
132   if n < 1
133     @io << '{}'
134   else
135     @io << '{'
136     @nested <<  [true, n * 2]
137   end
138 end
write_nil() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
140 def write_nil
141   @io << 'null'
142   write_delim
143 end
write_pl(obj) click to toggle source

Write a payload object. Not subject to extensions

    # File lib/puppet/pops/serialization/json.rb
162 def write_pl(obj)
163   @io << Puppet::Util::Json.dump(obj) << ','
164 end

Private Instance Methods

extension_indicator(ext) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
237 def extension_indicator(ext)
238   @verbose ? ext[1].name.sub(/^Puppet::Pops::Serialization::\w+::(.+)$/, '\1') : ext[0]
239 end
io_string() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
166 def io_string
167   if @io.is_a?(String)
168     @io
169   else
170     @io.pos = 0
171     @io.read
172   end
173 end
write_delim() click to toggle source
    # File lib/puppet/pops/serialization/json.rb
176 def write_delim
177   nesting = @nested.last
178   cnt = nesting.nil? ? nil : nesting[1]
179   case cnt
180   when 1
181     @io << (nesting[0] ? '}' : ']')
182     @nested.pop
183     write_delim
184   when Integer
185     if (cnt % 2) == 0 || !nesting[0]
186       @io << ','
187     else
188       @io << ':'
189     end
190     nesting[1] = cnt - 1
191   else
192     @io << ','
193   end
194 end
write_extension(ext, obj) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
213 def write_extension(ext, obj)
214   @io << '[' << extension_indicator(ext).to_json << ','
215   @nested << nil
216   write_extension_payload(ext, obj)
217   @nested.pop
218   if obj.is_a?(Extension::SequenceStart) && obj.sequence_size > 0
219     @nested << [false, obj.sequence_size]
220   else
221     if @io.is_a?(String)
222       @io.chop!
223     else
224       @io.pos -= 1
225     end
226     @io << ']'
227     write_delim
228   end
229 end
write_extension_payload(ext, obj) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
232 def write_extension_payload(ext, obj)
233   ext[2].call(obj)
234 end
write_scalar(obj) click to toggle source
    # File lib/puppet/pops/serialization/json.rb
197 def write_scalar(obj)
198   ext = @type_registry[obj.class]
199   if ext.nil?
200     case obj
201     when Numeric, String, true, false, nil
202       @io << Puppet::Util::Json.dump(obj)
203       write_delim
204     else
205       raise SerializationError, _("Unable to serialize a %{obj}") % { obj: obj.class.name }
206     end
207   else
208     write_extension(ext, obj)
209   end
210 end