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.



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

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.



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

def finished
  @finished
end

#keyObject

Returns the value of attribute key.



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

def key
  @key
end

#key_stackObject

stack to keep track of keys as we create nested hashes



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

def key_stack
  @key_stack ||= []
end

#optsObject

Returns the value of attribute opts.



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

def opts
  @opts
end

#stackObject

stack used to build up our complex object



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

def stack
  @stack ||= []
end

Class Method Details

.parse(obj, *args) ⇒ Object



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

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

Instance Method Details

#parse(str) ⇒ Object



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

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