class ProtocolBuffers::TextFormatter

Public Class Methods

new(options = nil) click to toggle source
# File lib/protocol_buffers/runtime/text_formatter.rb, line 3
def initialize(options = nil)
  @options = options || {}
end

Public Instance Methods

format(io, message, options = nil) click to toggle source
# File lib/protocol_buffers/runtime/text_formatter.rb, line 7
def format(io, message, options = nil)
  message.validate!
  options ||= {}
  options = options.merge(@options)
  options[:nest] ||= 0

  if options[:short]
    indent = ""
    newline = " "
  else
    indent = "  " * options[:nest]
    newline = "\n"
  end

  sep = ""
  message.fields.each do |tag, field|
    next unless message.value_for_tag?(tag)
    value = message.value_for_tag(tag)
    if field.repeated?
      next if value.size == 0
      value.each do |v|
        io.write sep; sep = newline

        format_field(io, field, v, indent, newline, options)
      end
    else
      io.write sep; sep = newline

      format_field(io, field, value, indent, newline, options)
    end
  end

  message.each_unknown_field do |tag_int, value|
    io.write sep; sep = newline

    wire_type = tag_int & 0x7
    id = tag_int >> 3
    format_unknown_field(io, wire_type, id, value, options)
  end

  io.write sep if !options[:short]

  io
end
format_field(io, field, value, indent, newline, options) click to toggle source
# File lib/protocol_buffers/runtime/text_formatter.rb, line 52
def format_field(io, field, value, indent, newline, options)
  if field.kind_of? Field::GroupField
    name = value.class.name.sub(/\A.*::/, '')
  else
    name = field.name
  end

  io.write "#{indent}#{name}"
  if field.kind_of? Field::AggregateField
    io.write " "
  else
    io.write ": "
  end
  field.text_format(io, value, options)
end
format_unknown_field(io, wire_type, id, value, options) click to toggle source
# File lib/protocol_buffers/runtime/text_formatter.rb, line 68
def format_unknown_field(io, wire_type, id, value, options)
  options = options.dup
  options[:nest] ||= 0

  if options[:short]
    indent = ""
    newline = " "
  else
    indent = "  " * options[:nest]
    newline = "\n"
  end

  if wire_type == 3
    options[:nest] += 1

    io.write "#{indent}#{id} {#{newline}"
  else
    io.write "#{indent}#{id}: "
  end

  case wire_type
  when 0 # VARINT
    io.write "#{value}"

  when 1 # FIXED64
    lo, hi = value.unpack("V2")
    io.write "0x%016x" % (hi << 32 | lo)

  when 5 # FIXED32
    io.write "0x%08x" % value.unpack("V")

  when 2 # LENGTH_DELIMITED
    value = value.unpack("C*").map { |b| "\\x%02x" % b }.join(nil)
    io.write "\"#{value}\""

  when 3 # START_GROUP
    format(io, value, options)

  when 4 # END_GROUP: never appear
    raise(EncodeError, "Unexpected wire type END_GROUP")
  else
    raise(EncodeError, "unknown wire type: #{wire_type}")
  end
  if wire_type == 3
    io.write "#{indent}}"
  end
end