Module: Protobuf::Message::Fields
- Included in:
- Protobuf::Message
- Defined in:
- lib/protobuf/message/fields.rb
Instance Method Summary collapse
-
#all_fields ⇒ Object
Field Access Methods.
- #define_field(rule, type_class, field_name, tag, options) ⇒ Object
- #extension_fields ⇒ Object
- #extension_ranges ⇒ Object
- #extension_tag?(tag) ⇒ Boolean
-
#extensions(range) ⇒ Object
Define an extension range.
- #field_store ⇒ Object
- #field_tag?(tag, allow_extension = false) ⇒ Boolean
- #fields ⇒ Object
- #get_extension_field(name_or_tag) ⇒ Object
- #get_field(name_or_tag, allow_extension = false) ⇒ Object
-
#optional(type_class, name, tag, options = {}) ⇒ Object
Define an optional field.
- #raise_if_name_collision(field_name) ⇒ Object
- #raise_if_tag_collision(tag, field_name) ⇒ Object
-
#repeated(type_class, name, tag, options = {}) ⇒ Object
Define a repeated field.
-
#required(type_class, name, tag, options = {}) ⇒ Object
Define a required field.
Instance Method Details
#all_fields ⇒ Object
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, ) raise_if_tag_collision(tag, field_name) raise_if_name_collision(field_name) field = ::Protobuf::Field.build(self, rule, type_class, field_name, tag, ) 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_fields ⇒ Object
51 52 53 |
# File 'lib/protobuf/message/fields.rb', line 51 def extension_fields @extension_fields ||= all_fields.select(&:extension?) end |
#extension_ranges ⇒ Object
55 56 57 |
# File 'lib/protobuf/message/fields.rb', line 55 def extension_ranges @extension_ranges ||= [] end |
#extension_tag?(tag) ⇒ 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_store ⇒ Object
63 64 65 |
# File 'lib/protobuf/message/fields.rb', line 63 def field_store @field_store ||= {} end |
#field_tag?(tag, allow_extension = false) ⇒ 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 |
#fields ⇒ Object
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, = {}) define_field(:optional, type_class, name, tag, ) 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, = {}) define_field(:repeated, type_class, name, tag, ) 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, = {}) define_field(:required, type_class, name, tag, ) end |