Module: Protobuf::Message::Fields

Included in:
Protobuf::Message
Defined in:
lib/protobuf/message/fields.rb

Instance Method Summary collapse

Instance Method Details

#all_fieldsObject

Field Access Methods



47
48
49
# File 'lib/protobuf/message/fields.rb', line 47

def all_fields
  @all_fields ||= field_store.values.uniq
end

#define_field(rule, type_class, field_name, tag, options) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/protobuf/message/fields.rb', line 92

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

  class_eval(<<-RAW_GETTER, __FILE__, __LINE__ + 1)
    define_method("#{field_name}!") do
      @values[:#{field_name}]
    end
  RAW_GETTER
end

#extension_fieldsObject



51
52
53
# File 'lib/protobuf/message/fields.rb', line 51

def extension_fields
  @extension_fields ||= all_fields.select(&:extension?)
end

#extension_rangesObject



55
56
57
# File 'lib/protobuf/message/fields.rb', line 55

def extension_ranges
  @extension_ranges ||= []
end

#extension_tag?(tag) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/protobuf/message/fields.rb', line 59

def extension_tag?(tag)
  tag.respond_to?(:to_i) && get_extension_field(tag).present?
end

#extensions(range) ⇒ Object

Define an extension range.



39
40
41
# File 'lib/protobuf/message/fields.rb', line 39

def extensions(range)
  extension_ranges << range
end

#field_storeObject



63
64
65
# File 'lib/protobuf/message/fields.rb', line 63

def field_store
  @field_store ||= {}
end

#field_tag?(tag, allow_extension = false) ⇒ Boolean

Returns:

  • (Boolean)


71
72
73
# File 'lib/protobuf/message/fields.rb', line 71

def field_tag?(tag, allow_extension = false)
  tag.respond_to?(:to_i) && get_field(tag, allow_extension).present?
end

#fieldsObject



67
68
69
# File 'lib/protobuf/message/fields.rb', line 67

def fields
  @fields ||= all_fields.reject(&:extension?)
end

#get_extension_field(name_or_tag) ⇒ Object



75
76
77
78
79
# File 'lib/protobuf/message/fields.rb', line 75

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) ⇒ Object



81
82
83
84
85
86
87
88
89
90
# File 'lib/protobuf/message/fields.rb', line 81

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 = {}) ⇒ Object

Define an optional field.



21
22
23
# File 'lib/protobuf/message/fields.rb', line 21

def optional(type_class, name, tag, options = {})
  define_field(:optional, type_class, name, tag, options)
end

#raise_if_name_collision(field_name) ⇒ Object



113
114
115
116
117
# File 'lib/protobuf/message/fields.rb', line 113

def raise_if_name_collision(field_name)
  if get_field(field_name, true)
    raise DuplicateFieldNameError, %!Field name #{field_name} has already been used in "#{name}".!
  end
end

#raise_if_tag_collision(tag, field_name) ⇒ Object



107
108
109
110
111
# File 'lib/protobuf/message/fields.rb', line 107

def raise_if_tag_collision(tag, field_name)
  if get_field(tag, true)
    raise TagCollisionError, %!Field number #{tag} has already been used in "#{name}" by field "#{field_name}".!
  end
end

#repeated(type_class, name, tag, options = {}) ⇒ Object

Define a repeated field.



27
28
29
# File 'lib/protobuf/message/fields.rb', line 27

def repeated(type_class, name, tag, options = {})
  define_field(:repeated, type_class, name, tag, options)
end

#required(type_class, name, tag, options = {}) ⇒ Object

Define a required field.



33
34
35
# File 'lib/protobuf/message/fields.rb', line 33

def required(type_class, name, tag, options = {})
  define_field(:required, type_class, name, tag, options)
end