module Protobuf::Message::Fields::ClassMethods

Public Instance Methods

all_fields() click to toggle source

Field Access Methods

# File lib/protobuf/message/fields.rb, line 53
def all_fields
  @all_fields ||= field_store.values.uniq.sort_by(&:tag)
end
define_field(rule, type_class, field_name, tag, options) click to toggle source
# File lib/protobuf/message/fields.rb, line 98
def define_field(rule, type_class, field_name, tag, options)
  raise_if_tag_collision(tag, field_name)
  raise_if_name_collision(field_name)

  field = ::Protobuf::Field.build(self, rule, type_class, field_name, tag, options)
  field_store[field_name] = field
  field_store[tag] = field

  define_method("#{field_name}!") do
    @values[field_name]
  end
end
extension_fields() click to toggle source
# File lib/protobuf/message/fields.rb, line 57
def extension_fields
  @extension_fields ||= all_fields.select(&:extension?)
end
extension_ranges() click to toggle source
# File lib/protobuf/message/fields.rb, line 61
def extension_ranges
  @extension_ranges ||= []
end
extension_tag?(tag) click to toggle source
# File lib/protobuf/message/fields.rb, line 65
def extension_tag?(tag)
  tag.respond_to?(:to_i) && get_extension_field(tag).present?
end
extensions(range) click to toggle source

Define an extension range.

# File lib/protobuf/message/fields.rb, line 46
def extensions(range)
  extension_ranges << range
end
field_store() click to toggle source
# File lib/protobuf/message/fields.rb, line 69
def field_store
  @field_store ||= {}
end
field_tag?(tag, allow_extension = false) click to toggle source
# File lib/protobuf/message/fields.rb, line 77
def field_tag?(tag, allow_extension = false)
  tag.respond_to?(:to_i) && get_field(tag, allow_extension).present?
end
fields() click to toggle source
# File lib/protobuf/message/fields.rb, line 73
def fields
  @fields ||= all_fields.reject(&:extension?)
end
get_extension_field(name_or_tag) click to toggle source
# File lib/protobuf/message/fields.rb, line 81
def get_extension_field(name_or_tag)
  name_or_tag = name_or_tag.to_sym if name_or_tag.respond_to?(:to_sym)
  field = field_store[name_or_tag]
  field if field.try(:extension?) { false }
end
get_field(name_or_tag, allow_extension = false) click to toggle source
# File lib/protobuf/message/fields.rb, line 87
def get_field(name_or_tag, allow_extension = false)
  name_or_tag = name_or_tag.to_sym if name_or_tag.respond_to?(:to_sym)
  field = field_store[name_or_tag]

  if field && (allow_extension || !field.extension?)
    field
  else
    nil
  end
end
optional(type_class, name, tag, options = {}) click to toggle source

Define an optional field.

# File lib/protobuf/message/fields.rb, line 28
def optional(type_class, name, tag, options = {})
  define_field(:optional, type_class, name, tag, options)
end
raise_if_name_collision(field_name) click to toggle source
# File lib/protobuf/message/fields.rb, line 117
def raise_if_name_collision(field_name)
  if get_field(field_name, true)
    fail DuplicateFieldNameError, %(Field name #{field_name} has already been used in "#{name}".)
  end
end
raise_if_tag_collision(tag, field_name) click to toggle source
# File lib/protobuf/message/fields.rb, line 111
def raise_if_tag_collision(tag, field_name)
  if get_field(tag, true)
    fail TagCollisionError, %(Field number #{tag} has already been used in "#{name}" by field "#{field_name}".)
  end
end
repeated(type_class, name, tag, options = {}) click to toggle source

Define a repeated field.

# File lib/protobuf/message/fields.rb, line 34
def repeated(type_class, name, tag, options = {})
  define_field(:repeated, type_class, name, tag, options)
end
required(type_class, name, tag, options = {}) click to toggle source

Define a required field.

# File lib/protobuf/message/fields.rb, line 40
def required(type_class, name, tag, options = {})
  define_field(:required, type_class, name, tag, options)
end

Private Instance Methods

inherit_fields!(subclass) click to toggle source
# File lib/protobuf/message/fields.rb, line 123
def inherit_fields!(subclass)
  instance_variables.each do |iv|
    subclass.instance_variable_set(iv, instance_variable_get(iv))
  end
end