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 65 def initialize(io, options = {}) 66 @io = io 67 @io << '[' 68 @type_registry = {} 69 @nested = [] 70 @verbose = options[:verbose] 71 @verbose = false if @verbose.nil? 72 @indent = options[:indent] || 0 73 end
Public Instance Methods
clear_io()
click to toggle source
# File lib/puppet/pops/serialization/json.rb 79 def clear_io 80 # Truncate everything except leading '[' 81 if @io.is_a?(String) 82 @io.slice!(1..-1) 83 else 84 @io.truncate(1) 85 end 86 end
empty?()
click to toggle source
# File lib/puppet/pops/serialization/json.rb 88 def empty? 89 @io.is_a?(String) ? io.length == 1 : @io.pos == 1 90 end
flush()
click to toggle source
# File lib/puppet/pops/serialization/json.rb 92 def flush 93 # Drop last comma unless just start marker present 94 if @io.is_a?(String) 95 @io.chop! unless @io.length == 1 96 @io << ']' 97 else 98 pos = @io.pos 99 @io.pos = pos - 1 unless pos == 1 100 @io << ']' 101 @io.flush 102 end 103 end
register_type(type, klass, &block)
click to toggle source
# File lib/puppet/pops/serialization/json.rb 75 def register_type(type, klass, &block) 76 @type_registry[klass] = [type, klass, block] 77 end
to_a()
click to toggle source
# File lib/puppet/pops/serialization/json.rb 148 def to_a 149 ::Puppet::Util::Json.load(io_string) 150 end
to_json()
click to toggle source
# File lib/puppet/pops/serialization/json.rb 152 def to_json 153 if @indent > 0 154 ::Puppet::Util::Json.dump(to_a, { :pretty => true, :indent => ' ' * @indent }) 155 else 156 io_string 157 end 158 end
to_s()
click to toggle source
# File lib/puppet/pops/serialization/json.rb 144 def to_s 145 to_json 146 end
write(obj)
click to toggle source
# File lib/puppet/pops/serialization/json.rb 105 def write(obj) 106 case obj 107 when Array 108 write_array_header(obj.size) 109 obj.each { |x| write(x) } 110 when Hash 111 write_map_header(obj.size) 112 obj.each_pair {|k, v| write(k); write(v) } 113 when nil 114 write_nil 115 else 116 write_scalar(obj) 117 end 118 end
Also aliased as: pack
write_array_header(n)
click to toggle source
# File lib/puppet/pops/serialization/json.rb 121 def write_array_header(n) 122 if n < 1 123 @io << '[]' 124 else 125 @io << '[' 126 @nested << [false, n] 127 end 128 end
write_map_header(n)
click to toggle source
# File lib/puppet/pops/serialization/json.rb 130 def write_map_header(n) 131 if n < 1 132 @io << '{}' 133 else 134 @io << '{' 135 @nested << [true, n * 2] 136 end 137 end
write_nil()
click to toggle source
# File lib/puppet/pops/serialization/json.rb 139 def write_nil 140 @io << 'null' 141 write_delim 142 end
write_pl(obj)
click to toggle source
Write a payload object. Not subject to extensions
# File lib/puppet/pops/serialization/json.rb 161 def write_pl(obj) 162 @io << Puppet::Util::Json.dump(obj) << ',' 163 end
Private Instance Methods
extension_indicator(ext)
click to toggle source
# File lib/puppet/pops/serialization/json.rb 236 def extension_indicator(ext) 237 @verbose ? ext[1].name.sub(/^Puppet::Pops::Serialization::\w+::(.+)$/, '\1') : ext[0] 238 end
io_string()
click to toggle source
# File lib/puppet/pops/serialization/json.rb 165 def io_string 166 if @io.is_a?(String) 167 @io 168 else 169 @io.pos = 0 170 @io.read 171 end 172 end
write_delim()
click to toggle source
# File lib/puppet/pops/serialization/json.rb 175 def write_delim 176 nesting = @nested.last 177 cnt = nesting.nil? ? nil : nesting[1] 178 case cnt 179 when 1 180 @io << (nesting[0] ? '}' : ']') 181 @nested.pop 182 write_delim 183 when Integer 184 if (cnt % 2) == 0 || !nesting[0] 185 @io << ',' 186 else 187 @io << ':' 188 end 189 nesting[1] = cnt - 1 190 else 191 @io << ',' 192 end 193 end
write_extension(ext, obj)
click to toggle source
# File lib/puppet/pops/serialization/json.rb 212 def write_extension(ext, obj) 213 @io << '[' << extension_indicator(ext).to_json << ',' 214 @nested << nil 215 write_extension_payload(ext, obj) 216 @nested.pop 217 if obj.is_a?(Extension::SequenceStart) && obj.sequence_size > 0 218 @nested << [false, obj.sequence_size] 219 else 220 if @io.is_a?(String) 221 @io.chop! 222 else 223 @io.pos -= 1 224 end 225 @io << ']' 226 write_delim 227 end 228 end
write_extension_payload(ext, obj)
click to toggle source
# File lib/puppet/pops/serialization/json.rb 231 def write_extension_payload(ext, obj) 232 ext[2].call(obj) 233 end
write_scalar(obj)
click to toggle source
# File lib/puppet/pops/serialization/json.rb 196 def write_scalar(obj) 197 ext = @type_registry[obj.class] 198 if ext.nil? 199 case obj 200 when Numeric, String, true, false, nil 201 @io << Puppet::Util::Json.dump(obj) 202 write_delim 203 else 204 raise SerializationError, _("Unable to serialize a %{obj}") % { obj: obj.class.name } 205 end 206 else 207 write_extension(ext, obj) 208 end 209 end