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