class MessagePack::Inspect::Inspector

Constants

FORMATS
HEADER_ARRAY16
HEADER_ARRAY32
HEADER_BIN16
HEADER_BIN32
HEADER_BIN8
HEADER_EXT16
HEADER_EXT32
HEADER_EXT8
HEADER_FALSE
HEADER_FIXARRAY
HEADER_FIXEXT1
HEADER_FIXEXT16
HEADER_FIXEXT2
HEADER_FIXEXT4
HEADER_FIXEXT8
HEADER_FIXINT_NEGATIVE
HEADER_FIXINT_POSITIVE
HEADER_FIXMAP
HEADER_FIXSTR
HEADER_FLOAT32
HEADER_FLOAT64
HEADER_INT16
HEADER_INT32
HEADER_INT64
HEADER_INT8
HEADER_MAP16
HEADER_MAP32
HEADER_NEVER_USED
HEADER_NIL
HEADER_STR16
HEADER_STR32
HEADER_STR8
HEADER_TRUE
HEADER_UINT16
HEADER_UINT32
HEADER_UINT64
HEADER_UINT8

Public Class Methods

new(io, format = :yaml, opt={}) click to toggle source
# File lib/msgpack/inspect/inspector.rb, line 6
def initialize(io, format = :yaml, opt={})
  # return_values: false, output_io: STDOUT
  @io = io
  @format = format
  @streamer = MessagePack::Inspect::Streamer.get(@format)
  @return_values = opt[:return_values] || false
  @output_io = opt[:output_io] || STDOUT
end

Public Instance Methods

dig(depth, heading = true, first_byte = nil) click to toggle source
# File lib/msgpack/inspect/inspector.rb, line 37
def dig(depth, heading = true, first_byte = nil)
  header_byte = first_byte || @io.read(1)
  # TODO: error handling for header_byte:nil or raised exception
  raise EOFError if header_byte.nil? && @io.eof?

  header = header_byte.b
  fmt = parse_header(header)
  node = MessagePack::Inspect::Node.new(fmt, header)
  node.extend @streamer
  node.io = @output_io
  node.depth = depth # Streamer#depth=
  node.heading = heading

  node.attributes(@io)

  if node.is_array?
    node.elements do |i|
      @streamer.object(@output_io, depth + 2, i) do
        obj = dig(depth + 2) # children -> array
        node << obj if @return_values
      end
    end
  elsif node.is_map?
    node.elements do |i|
      key = node.element_key do
        @streamer.object(@output_io, depth + 3, 0) do
          dig(depth + 3, false) # chilren -> array -> key
        end
      end
      value = node.element_value do
        @streamer.object(@output_io, depth + 3, 0) do
          dig(depth + 3, false) # children -> array -> value
        end
      end
      node[key] = value if @return_values
    end
  end

  node
end
inspect() click to toggle source
# File lib/msgpack/inspect/inspector.rb, line 15
def inspect
  data = []
  @streamer.objects(@output_io, 0) do
    i = 0
    begin
      while true
        first_byte = @io.read(1)
        break if first_byte.nil? && @io.eof?
        # breaking out of @streamer.object before writing object-start bytes into STDOUT
        @streamer.object(@output_io, 1, i) do
          obj = dig(1, true, first_byte)
          data << obj if @return_values
        end
        i += 1
      end
    rescue EOFError
      # end of input
    end
  end
  @return_values ? data : nil
end
parse_header(byte) click to toggle source
# File lib/msgpack/inspect/inspector.rb, line 116
def parse_header(byte)
  value = byte.unpack('C').first
  case value
  when HEADER_FIXINT_POSITIVE, HEADER_FIXINT_NEGATIVE then :fixint
  when HEADER_FIXMAP   then :fixmap
  when HEADER_FIXARRAY then :fixarray
  when HEADER_FIXSTR   then :fixstr
  when HEADER_NIL      then :nil
  when HEADER_NEVER_USED then :never_used
  when HEADER_FALSE then :false
  when HEADER_TRUE  then :true
  when HEADER_BIN8  then :bin8
  when HEADER_BIN16 then :bin16
  when HEADER_BIN32 then :bin32
  when HEADER_EXT8  then :ext8
  when HEADER_EXT16 then :ext16
  when HEADER_EXT32 then :ext32
  when HEADER_FLOAT32 then :float32
  when HEADER_FLOAT64 then :float64
  when HEADER_UINT8  then :uint8
  when HEADER_UINT16 then :uint16
  when HEADER_UINT32 then :uint32
  when HEADER_UINT64 then :uint64
  when HEADER_INT8   then :int8
  when HEADER_INT16  then :int16
  when HEADER_INT32  then :int32
  when HEADER_INT64  then :int64
  when HEADER_FIXEXT1  then :fixext1
  when HEADER_FIXEXT2  then :fixext2
  when HEADER_FIXEXT4  then :fixext4
  when HEADER_FIXEXT8  then :fixext8
  when HEADER_FIXEXT16 then :fixext16
  when HEADER_STR8  then :str8
  when HEADER_STR16 then :str16
  when HEADER_STR32 then :str32
  when HEADER_ARRAY16 then :array16
  when HEADER_ARRAY32 then :array32
  when HEADER_MAP16 then :map16
  when HEADER_MAP32 then :map32
  else
    raise "never reach here."
  end
end