Module: Rison

Defined in:
lib/rison.rb,
lib/rison/dump.rb,
lib/rison/lexer.rb,
lib/rison/parser.rb,
lib/rison/grammar.rb,
lib/rison/evaluator.rb

Defined Under Namespace

Classes: Evaluator, Grammar, LexerSpec, Parser

Constant Summary collapse

LEXER =
Dhaka::Lexer.new(LexerSpec)
EVALUATOR =
Evaluator.new

Class Method Summary collapse

Class Method Details

.dump(object) ⇒ Object



2
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
# File 'lib/rison/dump.rb', line 2

def self.dump(object)
  case object
    when NilClass then '!n'

    when TrueClass then '!t'

    when FalseClass then '!f'
      
    when Symbol then dump(object.to_s)

    when Rational then object.to_f.to_s
    
    when Numeric then object.to_s

    when String
      if object.empty?
        "''"
      elsif id?(object)
        object
      else
        quote(object)
      end

    when Hash
      '(%s)' % (object.sort_by { |k, v| k.to_s }.map { |(k, v)| '%s:%s' % [ dump(k), dump(v) ] } * ',')

    when Array
      '!(%s)' % (object.map { |x| dump(x) } * ',')

    else
      raise ArgumentError, 'cannot serialize: %p' % object
  end
end

.escape(string) ⇒ Object



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

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

.evaluate(parsed) ⇒ Object



26
27
28
# File 'lib/rison.rb', line 26

def self.evaluate(parsed)
  EVALUATOR.evaluate(parsed)
end

.id?(string) ⇒ Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/rison/dump.rb', line 44

def self.id?(string)
  string !~ /^(-|\d)/ && string !~  /['!:(),*@$ ]/
end

.lex(data) ⇒ Object



18
19
20
# File 'lib/rison.rb', line 18

def self.lex(data)
  LEXER.lex(data.to_s)
end

.load(data) ⇒ Object



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

def self.load(data)
  evaluate(parse(lex(data)))
end

.parse(lexed) ⇒ Object



22
23
24
# File 'lib/rison.rb', line 22

def self.parse(lexed)
  Parser.parse(lexed)
end

.quote(string) ⇒ Object



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

def self.quote(string)
  "'%s'" % escape(string)
end