class Groonga::Command::Parser::LoadValuesParser
Attributes
on_consumed[W]
on_end[W]
on_value[W]
Public Class Methods
new()
click to toggle source
# File lib/groonga/command/parser/load-values-parser.rb, line 26 def initialize initialize_parser @on_value = nil @on_consumed = nil @on_end = nil @containers = [] @keys = [] end
Public Instance Methods
<<(data)
click to toggle source
# File lib/groonga/command/parser/load-values-parser.rb, line 35 def <<(data) data_size = data.bytesize return self if data_size.zero? before_pos = @parser.pos status = catch do |tag| @tag = tag begin @parser << data rescue JSON::Stream::ParserError => error pos = @parser.pos consumed = pos - before_pos - 1 raise Error.new(error.message, data[0, consumed], data[consumed..-1]) end :continue end pos = @parser.pos consumed = pos - before_pos if consumed > 0 if consumed < data_size @on_consumed.call(data[0, consumed]) else @on_consumed.call(data) end end if status == :done if consumed < data_size @on_end.call(data[consumed..-1]) else @on_end.call(nil) end end self end
Private Instance Methods
initialize_parser()
click to toggle source
# File lib/groonga/command/parser/load-values-parser.rb, line 75 def initialize_parser @parser = JSON::Stream::Parser.new @parser.singleton_class.__send__(:attr_reader, :pos) @parser.end_document do throw(@tag, :done) end @parser.start_object do push_container({}) end @parser.end_object do pop_container end @parser.start_array do push_container([]) end @parser.end_array do pop_container end @parser.key do |key| push_key(key) end @parser.value do |value| push_value(value) end end
pop_container()
click to toggle source
# File lib/groonga/command/parser/load-values-parser.rb, line 105 def pop_container container = @containers.pop if @containers.size == 1 @on_value.call(container) else push_value(container) end end
push_container(container)
click to toggle source
# File lib/groonga/command/parser/load-values-parser.rb, line 101 def push_container(container) @containers.push(container) end
push_key(key)
click to toggle source
# File lib/groonga/command/parser/load-values-parser.rb, line 114 def push_key(key) @keys.push(key) end
push_value(value)
click to toggle source
# File lib/groonga/command/parser/load-values-parser.rb, line 118 def push_value(value) container = @containers.last case container when ::Hash container[@keys.pop] = value when ::Array container.push(value) end end