module Beefcake::Message
Public Class Methods
included(o)
click to toggle source
# File lib/beefcake.rb, line 238 def self.included(o) o.extend Dsl o.extend Decode o.send(:include, Encode) end
new(attrs={})
click to toggle source
(see assign)
# File lib/beefcake.rb, line 245 def initialize(attrs={}) assign attrs end
Public Instance Methods
==(o)
click to toggle source
# File lib/beefcake.rb, line 318 def ==(o) return false if (o == nil) || (o == false) return false unless o.is_a? self.class __beefcake_fields__.values.all? {|fld| self[fld.name] == o[fld.name] } end
[](k)
click to toggle source
# File lib/beefcake.rb, line 310 def [](k) __send__(k) end
[]=(k, v)
click to toggle source
# File lib/beefcake.rb, line 314 def []=(k, v) __send__("#{k}=", v) end
__beefcake_fields__()
click to toggle source
# File lib/beefcake.rb, line 306 def __beefcake_fields__ self.class.fields end
assign(attrs)
click to toggle source
Handles filling a protobuf message from a hash. Embedded messages can be passed in two ways, by a pure hash or as an instance of embedded class(es).
@example By a pure hash.
{:field1 => 2, :embedded => {:embedded_f1 => 'lala'}}
@example Repeated embedded message by a pure hash.
{:field1 => 2, :embedded => [ {:embedded_f1 => 'lala'}, {:embedded_f1 => 'lulu'} ]}
@example As an instance of embedded class.
{:field1 => 2, :embedded => EmbeddedMsg.new({:embedded_f1 => 'lala'})}
@param [Hash] data to fill a protobuf message with.
# File lib/beefcake.rb, line 265 def assign(attrs) __beefcake_fields__.values.each do |fld| attribute = attrs[fld.name] if attribute.nil? self[fld.name] = nil next end unless fld.is_protobuf? self[fld.name] = attribute next end if fld.repeated? && attribute.is_a?(Hash) self[fld.name] = fld.type.new(attribute) next end if fld.repeated? && attribute.is_a?(fld.type) self[fld.name] = [attribute] next end if fld.repeated? self[fld.name] = attribute.map do |i| fld.matches_type?(i) ? i : fld.type.new(i) end next end if fld.matches_type? attribute self[fld.name] = attribute next end self[fld.name] = fld.type.new(attribute) end self end
inspect()
click to toggle source
# File lib/beefcake.rb, line 324 def inspect set = __beefcake_fields__.values.select {|fld| self[fld.name] != nil } flds = set.map do |fld| val = self[fld.name] case fld.type when Class "#{fld.name}: #{val.inspect}" when Module title = name_for(fld.type, val) || "-NA-" "#{fld.name}: #{title}(#{val.inspect})" else "#{fld.name}: #{val.inspect}" end end "<#{self.class.name} #{flds.join(", ")}>" end
to_hash()
click to toggle source
# File lib/beefcake.rb, line 344 def to_hash __beefcake_fields__.values.inject({}) do |h, fld| v = self[fld.name] next h if v.nil? h[fld.name] = case when v.respond_to?(:to_hash) # A nested protobuf message, so let's call its 'to_hash' method. v.to_hash when v.is_a?(Array) # There can be two field types stored in array. # Primitive type or nested another protobuf message. # The later one has got a 'to_hash' method. v.map { |i| i.respond_to?(:to_hash) ? i.to_hash : i } else v end h end end