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