class Volt::EJSON

Constants

OTHER_VALID_CLASSES

Public Class Methods

parse(str) click to toggle source
# File lib/volt/utils/ejson.rb, line 13
def self.parse(str)
  decode(JSON.parse(str))
end
stringify(obj) click to toggle source
# File lib/volt/utils/ejson.rb, line 9
def self.stringify(obj)
  encode(obj).to_json
end

Private Class Methods

decode(obj) click to toggle source
# File lib/volt/utils/ejson.rb, line 19
def self.decode(obj)
  if Array === obj
    obj.map {|v| decode(v) }
  elsif Hash === obj
    if obj.size == 1 && (escape = obj['$escape'])
      return escape.map do |key, value|
        [key, decode(value)]
      end.to_h
    elsif obj.size == 1 && (time = obj['$date'])
      if time.is_a?(Fixnum)
        return Time.at(time / 1000.0)
      end
    end

    obj.map do |key, value|
      [key, decode(value)]
    end.to_h
  else
    obj
  end
end
encode(obj) click to toggle source
# File lib/volt/utils/ejson.rb, line 41
def self.encode(obj)
  if Array === obj
    obj.map {|v| encode(v) }
  elsif Hash === obj
    obj.map do |key, value|
      if key == '$date'
        key = '$escape'
        value = {'$date' => encode(value)}
      else
        value = encode(value)
      end

      [key, value]
    end.to_h
  elsif Time === obj
    {'$date' => obj.to_i * 1_000}
  elsif OTHER_VALID_CLASSES.any? {|klass| obj.is_a?(klass) }
    obj
  else
    # Not a valid class for serializing, raise an exception
    raise NonEjsonType, "Unable to serialize #{obj.inspect} to EJSON"
  end
end