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.



50
51
52
53
54
# File 'lib/ffi_yajl/parser.rb', line 50

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.



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

def finished
  @finished
end

#keyObject

Returns the value of attribute key.



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

def key
  @key
end

#key_stackObject

stack to keep track of keys as we create nested hashes



42
43
44
# File 'lib/ffi_yajl/parser.rb', line 42

def key_stack
  @key_stack ||= []
end

#optsObject

Returns the value of attribute opts.



30
31
32
# File 'lib/ffi_yajl/parser.rb', line 30

def opts
  @opts
end

#stackObject

stack used to build up our complex object



35
36
37
# File 'lib/ffi_yajl/parser.rb', line 35

def stack
  @stack ||= []
end

Class Method Details

.parse(obj, *args) ⇒ Object



46
47
48
# File 'lib/ffi_yajl/parser.rb', line 46

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

Instance Method Details

#parse(str) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/ffi_yajl/parser.rb', line 56

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]

  yajl_opts[:unique_key_checking]         = @opts[:unique_key_checking]

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

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

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