Module: Rison

Defined in:
lib/rison.rb,
lib/rison/dump.rb,
lib/rison/parslet_parser.rb,
lib/rison/parslet_transform.rb

Defined Under Namespace

Classes: DumpError, ParseError, ParsletParser, ParsletTransform

Constant Summary collapse

NIL =
'!n'.freeze
TRUE =
'!t'.freeze
FALSE =
'!f'.freeze

Class Method Summary collapse

Class Method Details

.dump(object) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/rison/dump.rb', line 12

def self.dump(object)
  case object
    when NilClass then NIL

    when TrueClass then TRUE

    when FalseClass then FALSE

    when Symbol then object.to_s

    when Rational then object.to_f.to_s

    when Numeric then object.to_s

    when String then "'#{escape(object)}'"

    when Hash then '(%s)' % object.map { |(k, v)| dump_pair(k, v) }.join(?,)

    when Array then '!(%s)' % object.map { |member| dump(member) }.join(?,)

    else
      raise DumpError, "Cannot encode #{object.class} objects"
  end
end

.dump_pair(key, value) ⇒ Object



37
38
39
# File 'lib/rison/dump.rb', line 37

def self.dump_pair(key, value)
  key.is_a?(Symbol) ? "#{key}:#{dump(value)}" : "#{dump(key.to_s)}:#{dump(value)}"
end

.escape(string) ⇒ Object



41
42
43
# File 'lib/rison/dump.rb', line 41

def self.escape(string)
  string.gsub('!', '!!').gsub("'", "!'")
end

.load(string) ⇒ Object



8
9
10
11
12
# File 'lib/rison.rb', line 8

def self.load(string)
  ParsletTransform.new.apply(ParsletParser.new.parse(string))
rescue Parslet::ParseFailed => exception
  raise ParseError, "Invalid Rison input. #{exception.message}"
end

.Number(int, frac = nil, exp = nil) ⇒ Object



39
40
41
42
43
# File 'lib/rison/parslet_transform.rb', line 39

def self.Number(int, frac = nil, exp = nil)
  base = frac ? int.to_i + Rational(frac.to_i, 10 ** frac.to_s.length) : int.to_i

  exp ? base * 10 ** exp.to_i : base
end