Class: FFI_Yajl::Parser

Inherits:
Object show all
Includes:
Ext::Parser, FFI::Parser
Defined in:
lib/ffi_yajl/ext.rb,
lib/ffi_yajl/ffi.rb,
lib/ffi_yajl/parser.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from FFI::Parser

#do_yajl_parse, #key_pop, #key_push, #set_value, #setup_callbacks, #stack_pop

Methods included from Ext::Parser

#do_yajl_parse

Constructor Details

#initialize(opts = {}) ⇒ Parser

Returns a new instance of Parser.



27
28
29
30
31
# File 'lib/ffi_yajl/parser.rb', line 27

def initialize(opts = {})
  @opts = opts ? opts.dup : {}
  # JSON gem uses 'symbolize_names' and ruby-yajl supports this as well
  @opts[:symbolize_keys] = true if @opts[:symbolize_names]
end

Instance Attribute Details

#finishedObject

Returns the value of attribute finished.



5
6
7
# File 'lib/ffi_yajl/parser.rb', line 5

def finished
  @finished
end

#keyObject

Returns the value of attribute key.



5
6
7
# File 'lib/ffi_yajl/parser.rb', line 5

def key
  @key
end

#key_stackObject

stack to keep track of keys as we create nested hashes



19
20
21
# File 'lib/ffi_yajl/parser.rb', line 19

def key_stack
  @key_stack
end

#optsObject

Returns the value of attribute opts.



7
8
9
# File 'lib/ffi_yajl/parser.rb', line 7

def opts
  @opts
end

#stackObject

stack used to build up our complex object



12
13
14
# File 'lib/ffi_yajl/parser.rb', line 12

def stack
  @stack
end

Class Method Details

.parse(obj, *args) ⇒ Object



23
24
25
# File 'lib/ffi_yajl/parser.rb', line 23

def self.parse(obj, *args)
  new(*args).parse(obj)
end

Instance Method Details

#parse(str) ⇒ Object



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
# File 'lib/ffi_yajl/parser.rb', line 33

def parse(str)
  # initialization that we can do in pure ruby
  yajl_opts = {}

  if @opts[:check_utf8] == false && @opts[:dont_validate_strings] == false
    raise ArgumentError, "options check_utf8 and dont_validate_strings are both false which conflict"
  end
  if @opts[:check_utf8] == true && @opts[:dont_validate_strings] == true
    raise ArgumentError, "options check_utf8 and dont_validate_strings are both true which conflict"
  end

  yajl_opts[:yajl_allow_comments]         = @opts[:allow_comments]
  yajl_opts[:yajl_dont_validate_strings]  = (@opts[:check_utf8] == false || @opts[:dont_validate_strings])
  yajl_opts[:yajl_allow_trailing_garbage] = @opts[:allow_trailing_garbage]
  yajl_opts[:yajl_allow_multiple_values]  = @opts[:allow_multiple_values]
  yajl_opts[:yajl_allow_partial_values]   = @opts[:allow_partial_values]

  # XXX: bug-compat with ruby-yajl
  return nil if str == ""

  if str.respond_to?(:read)
    str = str.read()
  end

  # call either the ext or ffi hook
  do_yajl_parse(str, yajl_opts)
end