13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
# File 'lib/cbor/dumper.rb', line 13
def dump(val)
case val
when nil
dump_simple(Simple::NULL)
when TrueClass
dump_simple(Simple::TRUE)
when FalseClass
dump_simple(Simple::FALSE)
when Fixnum, Bignum
if val < 0
dump_uint(Major::NEGINT, -val-1)
else
dump_uint(Major::UINT, val)
end
when Float
dump_simple(Simple::FLOAT64) + [val].pack("G")
when String, Symbol
s = val.to_s.dup.force_encoding(Encoding::UTF_8)
dump_uint(s.valid_encoding? ? Major::TEXTSTRING : Major::BYTESTRING, s.bytesize) + s.b
when Array
dump_uint(Major::ARRAY, val.count) + val.map{|e| dump(e)}.join
when Hash
dump_uint(Major::MAP, val.count) + val.map{|k, v| dump(k.to_s) + dump(v)}.join
else
klass = @@registered_classes.keys.find {|k| val.is_a? k}
if klass
h = @@registered_classes[klass]
dump_uint(Major::TAG, h[:tag]) + dump(h[:block].call(val))
else
raise CBOR::CborError.new("dumping not supported for objects of type #{val.class} (#{val.inspect})")
end
end
end
|