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.



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

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.



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

def finished
  @finished
end

#keyObject

Returns the value of attribute key.



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

def key
  @key
end

#key_stackObject

stack to keep track of keys as we create nested hashes



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

def key_stack
  @key_stack
end

#optsObject

Returns the value of attribute opts.



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

def opts
  @opts
end

#stackObject

stack used to build up our complex object



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

def stack
  @stack
end

Class Method Details

.parse(obj, *args) ⇒ Object



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

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

Instance Method Details

#parse(str) ⇒ Object



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

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 == ""

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

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