class Protobuf::Field::BaseField
Constants
- OBJECT_MODULE
Constants
- PACKED_TYPES
Attributes
default_value[R]
Attributes
fully_qualified_name[R]
Attributes
message_class[R]
Attributes
name[R]
Attributes
options[R]
Attributes
rule[R]
Attributes
tag[R]
Attributes
type_class[R]
Attributes
Public Class Methods
default()
click to toggle source
Class Methods
# File lib/protobuf/field/base_field.rb, line 31 def self.default nil end
new(message_class, rule, type_class, fully_qualified_name, tag, simple_name, options)
click to toggle source
Constructor
# File lib/protobuf/field/base_field.rb, line 39 def initialize(message_class, rule, type_class, fully_qualified_name, tag, simple_name, options) @message_class = message_class @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. @options = options.slice(:ctype, :packed, :deprecated, :lazy, :jstype, :weak, :uninterpreted_option, :default, :extension) options.each do |option_name, value| set_option(option_name, value) end @extension = options.key?(:extension) @deprecated = options.key?(:deprecated) @required = rule == :required @repeated = rule == :repeated @optional = rule == :optional @packed = @repeated && options.key?(:packed) validate_packed_field if packed? define_accessor(simple_name, fully_qualified_name) if simple_name set_repeated_message! 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 @to_message_hash = nil @to_message_hash_string_keys = 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_to_message_hash! define_encode_to_stream! set_default_value! end
Public Instance Methods
acceptable?(_value)
click to toggle source
Public Instance Methods
# File lib/protobuf/field/base_field.rb, line 89 def acceptable?(_value) true end
coerce!(value)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 93 def coerce!(value) value end
decode(_bytes)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 97 def decode(_bytes) fail NotImplementedError, "#{self.class.name}##{__method__}" end
default()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 101 def default options[:default] end
define_encode_to_stream!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 117 def define_encode_to_stream! @encode_to_stream = if repeated? && packed? OBJECT_MODULE::RepeatedPackedEncodeToStream.new(self) elsif repeated? OBJECT_MODULE::RepeatedNotPackedEncodeToStream.new(self) elsif message? || 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!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 147 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!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 135 def define_field_predicate! @field_predicate = if repeated? OBJECT_MODULE::RepeatedFieldPredicate.new(self) else OBJECT_MODULE::BaseFieldPredicate.new(self) end end
define_set_field!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 191 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!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 286 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!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 215 def define_to_message_hash! if message? || enum? || repeated? || map? @to_message_hash = OBJECT_MODULE::ToHashValueToMessageHash.new(self) @to_message_hash_string_keys = OBJECT_MODULE::ToHashValueToMessageHashWithStringKey.new(self) else @to_message_hash = OBJECT_MODULE::BaseToMessageHash.new(self) @to_message_hash_string_keys = OBJECT_MODULE::BaseToMessageHashWithStringKey.new(self) end end
define_value_from_values!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 159 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!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 175 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?()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 233 def deprecated? @deprecated end
encode(_value)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 237 def encode(_value) fail NotImplementedError, "#{self.class.name}##{__method__}" end
encode_to_stream(value, stream)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 131 def encode_to_stream(value, stream) @encode_to_stream.call(value, stream) end
enum?()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 245 def enum? false end
extension?()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 241 def extension? @extension end
field?(values)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 143 def field?(values) @field_predicate.call(values) end
field_and_present?(values)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 155 def field_and_present?(values) @field_and_present_predicate.call(values) end
fully_qualified_name_only!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 324 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_to_message_hash! define_encode_to_stream! end
map?()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 258 def map? @is_map end
message?()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 249 def message? false end
optional?()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 262 def optional? @optional end
packed?()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 266 def packed? @packed end
repeated?()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 270 def repeated? @repeated end
repeated_message?()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 278 def repeated_message? @repeated_message end
required?()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 282 def required? @required end
set(message_instance, bytes)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 298 def set(message_instance, bytes) @set_method.call(message_instance, bytes) end
set_default_value!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 105 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)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 211 def set_field(values, value, ignore_nil_for_repeated, message_instance) @set_field.call(values, value, ignore_nil_for_repeated, message_instance) end
set_map!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 253 def set_map! set_repeated_message! @is_map = repeated_message? && type_class.get_option!(:map_entry) end
set_repeated_message!()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 274 def set_repeated_message! @repeated_message = repeated? && message? end
tag_encoded()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 302 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)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 225 def to_message_hash(values, result) @to_message_hash.call(values, result) end
to_message_hash_with_string_key(values, result)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 229 def to_message_hash_with_string_key(values, result) @to_message_hash_string_keys.call(values, result) end
to_s()
click to toggle source
FIXME: add packed, deprecated, extension options to to_s
output
# File lib/protobuf/field/base_field.rb, line 314 def to_s "#{rule} #{type_class} #{name} = #{tag} #{default ? "[default=#{default.inspect}]" : ''}" end
value_from_values(values)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 171 def value_from_values(values) @value_from_values.call(values) end
value_from_values_for_serialization(values)
click to toggle source
# File lib/protobuf/field/base_field.rb, line 187 def value_from_values_for_serialization(values) @value_from_values_for_serialization.call(values) end
wire_type()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 320 def wire_type ::Protobuf::WireType::VARINT end
Private Instance Methods
define_accessor(simple_field_name, fully_qualified_field_name)
click to toggle source
Private Instance Methods
# File lib/protobuf/field/base_field.rb, line 346 def define_accessor(simple_field_name, fully_qualified_field_name) message_class.class_eval do define_method("#{simple_field_name}!") do @values[fully_qualified_field_name] if field?(fully_qualified_field_name) end end message_class.class_eval do define_method(simple_field_name) { self[fully_qualified_field_name] } define_method("#{simple_field_name}=") { |v| set_field(fully_qualified_field_name, v, false) } end return unless deprecated? ::Protobuf.field_deprecator.deprecate_method(message_class, simple_field_name) ::Protobuf.field_deprecator.deprecate_method(message_class, "#{simple_field_name}!") ::Protobuf.field_deprecator.deprecate_method(message_class, "#{simple_field_name}=") end
typed_default_value()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 365 def typed_default_value if default.nil? self.class.default else default end end
validate_packed_field()
click to toggle source
# File lib/protobuf/field/base_field.rb, line 373 def validate_packed_field if packed? && ! ::Protobuf::Field::BaseField::PACKED_TYPES.include?(wire_type) fail "Can't use packed encoding for '#{type_class}' type" end end