module Beefcake::Message::Encode

Public Instance Methods

encode(buf = Buffer.new) click to toggle source
# File lib/beefcake.rb, line 83
def encode(buf = Buffer.new)
  validate!

  if ! buf.respond_to?(:<<)
    raise ArgumentError, "buf doesn't respond to `<<`"
  end

  if ! buf.is_a?(Buffer)
    buf = Buffer.new(buf)
  end

  # TODO: Error if any required fields at nil

  __beefcake_fields__.values.sort.each do |fld|
    if fld.opts[:packed]
      bytes = encode!(Buffer.new, fld, 0)
      buf.append_info(fld.fn, Buffer.wire_for(fld.type))
      buf.append_uint64(bytes.length)
      buf << bytes
    else
      encode!(buf, fld, fld.fn)
    end
  end

  buf
end
encode!(buf, fld, fn) click to toggle source
# File lib/beefcake.rb, line 110
def encode!(buf, fld, fn)
  v = self[fld.name]
  v = v.is_a?(Array) ? v : [v]

  v.compact.each do |val|
    case fld.type
    when Class # encodable
      # TODO: raise error if type != val.class
      buf.append(:string, val.encode, fn)
    when Module # enum
      if ! valid_enum?(fld.type, val)
        raise InvalidValueError.new(fld.name, val)
      end

      buf.append(:int32, val, fn)
    else
      buf.append(fld.type, val, fn)
    end
  end

  buf
end
name_for(mod, val) click to toggle source
# File lib/beefcake.rb, line 151
def name_for(mod, val)
  mod.constants.each do |name|
    if mod.const_get(name) == val
      return name
    end
  end
  nil
end
valid_enum?(mod, val) click to toggle source
# File lib/beefcake.rb, line 147
def valid_enum?(mod, val)
  !!name_for(mod, val)
end
validate!() click to toggle source
# File lib/beefcake.rb, line 160
def validate!
  __beefcake_fields__.values.each do |fld|
    if fld.rule == :required && self[fld.name].nil?
      raise RequiredFieldNotSetError, fld.name
    end
  end
end
write_delimited(buf = Buffer.new) click to toggle source
# File lib/beefcake.rb, line 133
def write_delimited(buf = Buffer.new)
  if ! buf.respond_to?(:<<)
    raise ArgumentError, "buf doesn't respond to `<<`"
  end

  if ! buf.is_a?(Buffer)
    buf = Buffer.new(buf)
  end

  buf.append_bytes(encode)

  buf
end