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