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