Module: Zon::Serializer

Defined in:
lib/zon/serializer.rb

Class Method Summary collapse

Class Method Details

.serialize_object(obj, options = {}, level = 0) ⇒ Object



3
4
5
6
7
8
9
10
11
12
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/zon/serializer.rb', line 3

def self.serialize_object(obj, options = {}, level = 0)

  defaults = { :indent_level => 0, :ibase => 16 }
  options = defaults.merge(options)

  if obj.is_a? Integer
    s = ""
    case options[:ibase]
    when 16
      s += "0x"
    when 8
      s += "0o"
    when 2
      s += "0b"
    end

    s += obj.to_s(options[:ibase])
    s
  elsif obj.is_a? Float
    String(obj)
  elsif obj.is_a? String
    "\"" + obj + "\""
  elsif obj.is_a? Array
    out = ""
    l = obj.length

    out += ".{"
    if options[:indent_level] > 0
      out += "\n"
    end
    
    obj.each.with_index do |elem, idx|
      if options[:indent_level] > 0
        out += " " * (options[:indent_level] * (level + 1))
      else
        out += " "
      end

      out += self.serialize_object(elem, options, level + 1) 

      if options[:indent_level] > 0
        out += ",\n" 
      else
        out += "," if idx < l - 1 # l is at least 1 otherwise this loop is not entered
        out += " " if idx == l - 1 # last elem
      end
    end
    
    if options[:indent_level] > 0
        out += " " * (options[:indent_level] * level)
    end
    out += "}"
    out
  elsif obj.is_a? Hash
    out = ""
    l = obj.length

    out += ".{"
    if options[:indent_level] > 0
      out += "\n"
    end

    obj.each.with_index do |kv, idx|
      key = kv[0]
      value = kv[1]

      raise "Key #{key} must be a Symbol" if not key.is_a? Symbol

      if options[:indent_level] > 0
        out += " " * (options[:indent_level] * (level + 1))
      else
        out += " "
      end

      out += "." + String(key)
      out += " = "
      out += self.serialize_object(value, options, level + 1) 
      if options[:indent_level] > 0
        out += ",\n" 
      else
        out += "," if idx < l - 1 # l is at least 1 otherwise this loop is not entered
        out += " " if idx == l - 1 # last elem
      end
    end

    if options[:indent_level] > 0
        out += " " * (options[:indent_level] * level)
    end
    out += "}"
    out
  elsif obj.is_a? TrueClass
    "true"
  elsif obj.is_a? FalseClass
    "false"
  elsif obj.is_a? Symbol
    "." + String(obj)
  else
    raise ArgumentError, "Unable to serialize '#{obj}' of Class '#{obj.class}' to ZON"
  end 
end