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
60
61
62
63
64
65
66
# File 'lib/ffi_yajl/parser.rb', line 33

def parse(str)
  raise FFI_Yajl::ParseError, "input must be a string or IO" unless str.is_a?(String) || str.respond_to?(:read)

  # 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]         = true

  if @opts.key?(:allow_comments)
    yajl_opts[:yajl_allow_comments]       = @opts[:allow_comments]
  end

  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