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
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