Class: Yajl::FFI::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/yajl/ffi/builder.rb

Overview

A parser listener that builds a full, in memory, object from a JSON document. This is similar to using the json gem’s ‘JSON.parse` method.

Examples

parser = Yajl::FFI::Parser.new
builder = Yajl::FFI::Builder.new(parser)
parser << '{"answer": 42, "question": false}'
obj = builder.result

Constant Summary collapse

METHODS =
%w[start_document end_document start_object end_object start_array end_array key value]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parser) ⇒ Builder

Returns a new instance of Builder.



17
18
19
20
21
# File 'lib/yajl/ffi/builder.rb', line 17

def initialize(parser)
  METHODS.each do |name|
    parser.send(name, &method(name))
  end
end

Instance Attribute Details

#resultObject (readonly)

Returns the value of attribute result.



15
16
17
# File 'lib/yajl/ffi/builder.rb', line 15

def result
  @result
end

Instance Method Details

#end_documentObject



29
30
31
# File 'lib/yajl/ffi/builder.rb', line 29

def end_document
  @result = @stack.pop
end

#end_objectObject Also known as: end_array



37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/yajl/ffi/builder.rb', line 37

def end_object
  return if @stack.size == 1

  node = @stack.pop
  top = @stack[-1]

  case top
  when Hash
    top[@keys.pop] = node
  when Array
    top << node
  end
end

#key(key) ⇒ Object



56
57
58
# File 'lib/yajl/ffi/builder.rb', line 56

def key(key)
  @keys << key
end

#start_arrayObject



52
53
54
# File 'lib/yajl/ffi/builder.rb', line 52

def start_array
  @stack.push([])
end

#start_documentObject



23
24
25
26
27
# File 'lib/yajl/ffi/builder.rb', line 23

def start_document
  @stack = []
  @keys = []
  @result = nil
end

#start_objectObject



33
34
35
# File 'lib/yajl/ffi/builder.rb', line 33

def start_object
  @stack.push({})
end

#value(value) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
# File 'lib/yajl/ffi/builder.rb', line 60

def value(value)
  top = @stack[-1]
  case top
  when Hash
    top[@keys.pop] = value
  when Array
    top << value
  else
    @stack << value
  end
end