Module: Protobuf::Message::Fields::ClassMethods

Defined in:
lib/protobuf/message/fields.rb

Instance Method Summary collapse

Instance Method Details

#all_fieldsObject

Field Access Methods



53
54
55
# 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) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
# 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_fieldsObject



57
58
59
# File 'lib/protobuf/message/fields.rb', line 57

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

#extension_rangesObject



61
62
63
# File 'lib/protobuf/message/fields.rb', line 61

def extension_ranges
  @extension_ranges ||= []
end

#extension_tag?(tag) ⇒ Boolean

Returns:

  • (Boolean)


65
66
67
# 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) ⇒ Object

Define an extension range.



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

def extensions(range)
  extension_ranges << range
end

#field_storeObject



69
70
71
# File 'lib/protobuf/message/fields.rb', line 69

def field_store
  @field_store ||= {}
end

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

Returns:

  • (Boolean)


77
78
79
# 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

#fieldsObject



73
74
75
# File 'lib/protobuf/message/fields.rb', line 73

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

#get_extension_field(name_or_tag) ⇒ Object



81
82
83
84
85
# 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) ⇒ Object



87
88
89
90
91
92
93
94
95
96
# 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 = {}) ⇒ Object

Define an optional field.



28
29
30
# 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) ⇒ Object



117
118
119
120
121
# 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) ⇒ Object



111
112
113
114
115
# 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 = {}) ⇒ Object

Define a repeated field.



34
35
36
# 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 = {}) ⇒ Object

Define a required field.



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

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