Class: Protobuf::Field::BaseField
- Inherits:
-
Object
- Object
- Protobuf::Field::BaseField
- Includes:
- Logging
- Defined in:
- lib/protobuf/field/base_field.rb
Direct Known Subclasses
Constant Summary collapse
- OBJECT_MODULE =
Constants
::Protobuf::Field::BaseFieldObjectDefinitions
- PACKED_TYPES =
[ ::Protobuf::WireType::VARINT, ::Protobuf::WireType::FIXED32, ::Protobuf::WireType::FIXED64, ].freeze
Instance Attribute Summary collapse
-
#default_value ⇒ Object
readonly
Attributes.
-
#fully_qualified_name ⇒ Object
readonly
Attributes.
-
#message_class ⇒ Object
readonly
Attributes.
-
#name ⇒ Object
readonly
Attributes.
-
#options ⇒ Object
readonly
Attributes.
-
#rule ⇒ Object
readonly
Attributes.
-
#tag ⇒ Object
readonly
Attributes.
-
#type_class ⇒ Object
readonly
Attributes.
Class Method Summary collapse
-
.default ⇒ Object
Class Methods.
Instance Method Summary collapse
-
#acceptable?(_value) ⇒ Boolean
Public Instance Methods.
- #coerce!(value) ⇒ Object
- #decode(_bytes) ⇒ Object
- #default ⇒ Object
- #define_encode_to_stream! ⇒ Object
- #define_field_and_present_predicate! ⇒ Object
- #define_field_predicate! ⇒ Object
- #define_set_field! ⇒ Object
- #define_set_method! ⇒ Object
- #define_to_message_hash! ⇒ Object
- #define_value_from_values! ⇒ Object
- #define_value_from_values_for_serialization! ⇒ Object
- #deprecated? ⇒ Boolean
- #encode(_value) ⇒ Object
- #encode_to_stream(value, stream) ⇒ Object
- #enum? ⇒ Boolean
- #extension? ⇒ Boolean
- #field?(values) ⇒ Boolean
- #field_and_present?(values) ⇒ Boolean
- #fully_qualified_name_only! ⇒ Object
-
#initialize(message_class, rule, type_class, fully_qualified_name, tag, simple_name, options) ⇒ BaseField
constructor
Constructor.
- #map? ⇒ Boolean
- #message? ⇒ Boolean
- #optional? ⇒ Boolean
- #packed? ⇒ Boolean
- #repeated? ⇒ Boolean
- #repeated_message? ⇒ Boolean
- #required? ⇒ Boolean
- #set(message_instance, bytes) ⇒ Object
- #set_default_value! ⇒ Object
- #set_field(values, value, ignore_nil_for_repeated, message_instance) ⇒ Object
- #set_map! ⇒ Object
- #set_repeated_message! ⇒ Object
- #tag_encoded ⇒ Object
- #to_message_hash(values, result) ⇒ Object
- #to_message_hash_with_string_key(values, result) ⇒ Object
-
#to_s ⇒ Object
FIXME: add packed, deprecated, extension options to to_s output.
- #value_from_values(values) ⇒ Object
- #value_from_values_for_serialization(values) ⇒ Object
- #wire_type ⇒ Object
Methods included from Logging
initialize_logger, #log_exception, #log_signature, #logger, #sign_message
Constructor Details
#initialize(message_class, rule, type_class, fully_qualified_name, tag, simple_name, options) ⇒ BaseField
Constructor
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/protobuf/field/base_field.rb', line 40 def initialize(, rule, type_class, fully_qualified_name, tag, simple_name, ) = @name = simple_name || fully_qualified_name @fully_qualified_name = fully_qualified_name @rule = rule @tag = tag @type_class = type_class # Populate the option hash with all the original default field options, for backwards compatibility. # However, both default and custom options should ideally be accessed through the Optionable .{get,get!}_option functions. = .slice(:ctype, :packed, :deprecated, :lazy, :jstype, :weak, :uninterpreted_option, :default, :extension) .each do |option_name, value| set_option(option_name, value) end @extension = .key?(:extension) @deprecated = .key?(:deprecated) @required = rule == :required @repeated = rule == :repeated @optional = rule == :optional @packed = @repeated && .key?(:packed) validate_packed_field if packed? define_accessor(simple_name, fully_qualified_name) if simple_name set_map! @value_from_values = nil @value_from_values_for_serialization = nil @field_predicate = nil @field_and_present_predicate = nil @set_field = nil @set_method = nil = nil = nil @encode_to_stream = nil define_value_from_values! define_value_from_values_for_serialization! define_field_predicate! define_field_and_present_predicate! define_set_field! define_set_method! define_encode_to_stream! set_default_value! end |
Instance Attribute Details
#default_value ⇒ Object (readonly)
Attributes
26 27 28 |
# File 'lib/protobuf/field/base_field.rb', line 26 def default_value @default_value end |
#fully_qualified_name ⇒ Object (readonly)
Attributes
26 27 28 |
# File 'lib/protobuf/field/base_field.rb', line 26 def fully_qualified_name @fully_qualified_name end |
#message_class ⇒ Object (readonly)
Attributes
26 27 28 |
# File 'lib/protobuf/field/base_field.rb', line 26 def end |
#name ⇒ Object (readonly)
Attributes
26 27 28 |
# File 'lib/protobuf/field/base_field.rb', line 26 def name @name end |
#options ⇒ Object (readonly)
Attributes
26 27 28 |
# File 'lib/protobuf/field/base_field.rb', line 26 def end |
#rule ⇒ Object (readonly)
Attributes
26 27 28 |
# File 'lib/protobuf/field/base_field.rb', line 26 def rule @rule end |
#tag ⇒ Object (readonly)
Attributes
26 27 28 |
# File 'lib/protobuf/field/base_field.rb', line 26 def tag @tag end |
#type_class ⇒ Object (readonly)
Attributes
26 27 28 |
# File 'lib/protobuf/field/base_field.rb', line 26 def type_class @type_class end |
Class Method Details
.default ⇒ Object
Class Methods
32 33 34 |
# File 'lib/protobuf/field/base_field.rb', line 32 def self.default nil end |
Instance Method Details
#acceptable?(_value) ⇒ Boolean
Public Instance Methods
90 91 92 |
# File 'lib/protobuf/field/base_field.rb', line 90 def acceptable?(_value) true end |
#coerce!(value) ⇒ Object
94 95 96 |
# File 'lib/protobuf/field/base_field.rb', line 94 def coerce!(value) value end |
#decode(_bytes) ⇒ Object
98 99 100 |
# File 'lib/protobuf/field/base_field.rb', line 98 def decode(_bytes) fail NotImplementedError, "#{self.class.name}##{__method__}" end |
#default ⇒ Object
102 103 104 |
# File 'lib/protobuf/field/base_field.rb', line 102 def default [:default] end |
#define_encode_to_stream! ⇒ Object
118 119 120 121 122 123 124 125 126 127 128 129 130 |
# File 'lib/protobuf/field/base_field.rb', line 118 def define_encode_to_stream! @encode_to_stream = if repeated? && packed? OBJECT_MODULE::RepeatedPackedEncodeToStream.new(self) elsif repeated? OBJECT_MODULE::RepeatedNotPackedEncodeToStream.new(self) elsif || type_class == ::Protobuf::Field::BytesField OBJECT_MODULE::BytesEncodeToStream.new(self) elsif type_class == ::Protobuf::Field::StringField OBJECT_MODULE::StringEncodeToStream.new(self) else OBJECT_MODULE::BaseEncodeToStream.new(self) end end |
#define_field_and_present_predicate! ⇒ Object
148 149 150 151 152 153 154 |
# File 'lib/protobuf/field/base_field.rb', line 148 def define_field_and_present_predicate! @field_and_present_predicate = if !repeated? && type_class == ::Protobuf::Field::BoolField # boolean present check OBJECT_MODULE::BoolFieldAndPresentPredicate.new(self) else OBJECT_MODULE::BaseFieldAndPresentPredicate.new(self) end end |
#define_field_predicate! ⇒ Object
136 137 138 139 140 141 142 |
# File 'lib/protobuf/field/base_field.rb', line 136 def define_field_predicate! @field_predicate = if repeated? OBJECT_MODULE::RepeatedFieldPredicate.new(self) else OBJECT_MODULE::BaseFieldPredicate.new(self) end end |
#define_set_field! ⇒ Object
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
# File 'lib/protobuf/field/base_field.rb', line 192 def define_set_field! @set_field = if map? && required? OBJECT_MODULE::RequiredMapSetField.new(self) elsif repeated? && required? OBJECT_MODULE::RequiredRepeatedSetField.new(self) elsif type_class == ::Protobuf::Field::StringField && required? OBJECT_MODULE::RequiredStringSetField.new(self) elsif required? OBJECT_MODULE::RequiredBaseSetField.new(self) elsif map? OBJECT_MODULE::MapSetField.new(self) elsif repeated? OBJECT_MODULE::RepeatedSetField.new(self) elsif type_class == ::Protobuf::Field::StringField OBJECT_MODULE::StringSetField.new(self) else OBJECT_MODULE::BaseSetField.new(self) end end |
#define_set_method! ⇒ Object
287 288 289 290 291 292 293 294 295 296 297 |
# File 'lib/protobuf/field/base_field.rb', line 287 def define_set_method! @set_method = if map? OBJECT_MODULE::MapSetMethod.new(self) elsif repeated? && packed? OBJECT_MODULE::RepeatedPackedSetMethod.new(self) elsif repeated? OBJECT_MODULE::RepeatedNotPackedSetMethod.new(self) else OBJECT_MODULE::BaseSetMethod.new(self) end end |
#define_to_message_hash! ⇒ Object
216 217 218 219 220 221 222 223 224 |
# File 'lib/protobuf/field/base_field.rb', line 216 def if || enum? || repeated? || map? = OBJECT_MODULE::ToHashValueToMessageHash.new(self) = OBJECT_MODULE::ToHashValueToMessageHashWithStringKey.new(self) else = OBJECT_MODULE::BaseToMessageHash.new(self) = OBJECT_MODULE::BaseToMessageHashWithStringKey.new(self) end end |
#define_value_from_values! ⇒ Object
160 161 162 163 164 165 166 167 168 169 170 |
# File 'lib/protobuf/field/base_field.rb', line 160 def define_value_from_values! @value_from_values = if map? OBJECT_MODULE::MapValueFromValues.new(self) elsif repeated? OBJECT_MODULE::RepeatedFieldValueFromValues.new(self) elsif type_class == ::Protobuf::Field::BoolField # boolean present check OBJECT_MODULE::BoolFieldValueFromValues.new(self) else OBJECT_MODULE::BaseFieldValueFromValues.new(self) end end |
#define_value_from_values_for_serialization! ⇒ Object
176 177 178 179 180 181 182 183 184 185 186 |
# File 'lib/protobuf/field/base_field.rb', line 176 def define_value_from_values_for_serialization! @value_from_values_for_serialization = if map? OBJECT_MODULE::MapValueFromValuesForSerialization.new(self) elsif repeated? OBJECT_MODULE::RepeatedFieldValueFromValuesForSerialization.new(self) elsif type_class == ::Protobuf::Field::BoolField # boolean present check OBJECT_MODULE::BoolFieldValueFromValuesForSerialization.new(self) else OBJECT_MODULE::BaseFieldValueFromValuesForSerialization.new(self) end end |
#deprecated? ⇒ Boolean
234 235 236 |
# File 'lib/protobuf/field/base_field.rb', line 234 def deprecated? @deprecated end |
#encode(_value) ⇒ Object
238 239 240 |
# File 'lib/protobuf/field/base_field.rb', line 238 def encode(_value) fail NotImplementedError, "#{self.class.name}##{__method__}" end |
#encode_to_stream(value, stream) ⇒ Object
132 133 134 |
# File 'lib/protobuf/field/base_field.rb', line 132 def encode_to_stream(value, stream) @encode_to_stream.call(value, stream) end |
#enum? ⇒ Boolean
246 247 248 |
# File 'lib/protobuf/field/base_field.rb', line 246 def enum? false end |
#extension? ⇒ Boolean
242 243 244 |
# File 'lib/protobuf/field/base_field.rb', line 242 def extension? @extension end |
#field?(values) ⇒ Boolean
144 145 146 |
# File 'lib/protobuf/field/base_field.rb', line 144 def field?(values) @field_predicate.call(values) end |
#field_and_present?(values) ⇒ Boolean
156 157 158 |
# File 'lib/protobuf/field/base_field.rb', line 156 def field_and_present?(values) @field_and_present_predicate.call(values) end |
#fully_qualified_name_only! ⇒ Object
325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 |
# File 'lib/protobuf/field/base_field.rb', line 325 def fully_qualified_name_only! @name = @fully_qualified_name ## # Recreate all of the meta methods as they may have used the original `name` value # define_value_from_values! define_value_from_values_for_serialization! define_field_predicate! define_field_and_present_predicate! define_set_field! define_set_method! define_encode_to_stream! end |
#map? ⇒ Boolean
259 260 261 |
# File 'lib/protobuf/field/base_field.rb', line 259 def map? @is_map end |
#message? ⇒ Boolean
250 251 252 |
# File 'lib/protobuf/field/base_field.rb', line 250 def false end |
#optional? ⇒ Boolean
263 264 265 |
# File 'lib/protobuf/field/base_field.rb', line 263 def optional? @optional end |
#packed? ⇒ Boolean
267 268 269 |
# File 'lib/protobuf/field/base_field.rb', line 267 def packed? @packed end |
#repeated? ⇒ Boolean
271 272 273 |
# File 'lib/protobuf/field/base_field.rb', line 271 def repeated? @repeated end |
#repeated_message? ⇒ Boolean
279 280 281 |
# File 'lib/protobuf/field/base_field.rb', line 279 def end |
#required? ⇒ Boolean
283 284 285 |
# File 'lib/protobuf/field/base_field.rb', line 283 def required? @required end |
#set(message_instance, bytes) ⇒ Object
299 300 301 |
# File 'lib/protobuf/field/base_field.rb', line 299 def set(, bytes) @set_method.call(, bytes) end |
#set_default_value! ⇒ Object
106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/protobuf/field/base_field.rb', line 106 def set_default_value! @default_value ||= if optional? || required? typed_default_value elsif map? ::Protobuf::Field::FieldHash.new(self).freeze elsif repeated? ::Protobuf::Field::FieldArray.new(self).freeze else fail "Unknown field label -- something went very wrong" end end |
#set_field(values, value, ignore_nil_for_repeated, message_instance) ⇒ Object
212 213 214 |
# File 'lib/protobuf/field/base_field.rb', line 212 def set_field(values, value, ignore_nil_for_repeated, ) @set_field.call(values, value, ignore_nil_for_repeated, ) end |
#set_map! ⇒ Object
254 255 256 257 |
# File 'lib/protobuf/field/base_field.rb', line 254 def set_map! @is_map = && type_class.get_option!(:map_entry) end |
#set_repeated_message! ⇒ Object
275 276 277 |
# File 'lib/protobuf/field/base_field.rb', line 275 def = repeated? && end |
#tag_encoded ⇒ Object
303 304 305 306 307 308 309 310 311 312 |
# File 'lib/protobuf/field/base_field.rb', line 303 def tag_encoded @tag_encoded ||= begin case when repeated? && packed? ::Protobuf::Field::VarintField.encode((tag << 3) | ::Protobuf::WireType::LENGTH_DELIMITED) else ::Protobuf::Field::VarintField.encode((tag << 3) | wire_type) end end end |
#to_message_hash(values, result) ⇒ Object
226 227 228 |
# File 'lib/protobuf/field/base_field.rb', line 226 def (values, result) .call(values, result) end |
#to_message_hash_with_string_key(values, result) ⇒ Object
230 231 232 |
# File 'lib/protobuf/field/base_field.rb', line 230 def (values, result) .call(values, result) end |
#to_s ⇒ Object
FIXME: add packed, deprecated, extension options to to_s output
315 316 317 |
# File 'lib/protobuf/field/base_field.rb', line 315 def to_s "#{rule} #{type_class} #{name} = #{tag} #{default ? "[default=#{default.inspect}]" : ''}" end |
#value_from_values(values) ⇒ Object
172 173 174 |
# File 'lib/protobuf/field/base_field.rb', line 172 def value_from_values(values) @value_from_values.call(values) end |
#value_from_values_for_serialization(values) ⇒ Object
188 189 190 |
# File 'lib/protobuf/field/base_field.rb', line 188 def value_from_values_for_serialization(values) @value_from_values_for_serialization.call(values) end |
#wire_type ⇒ Object
321 322 323 |
# File 'lib/protobuf/field/base_field.rb', line 321 def wire_type ::Protobuf::WireType::VARINT end |