class Protobuf::Field::BaseField

Constants

PACKED_TYPES

Constants

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 28
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 36
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

  validate_packed_field if packed?
  define_accessor(simple_name, fully_qualified_name) if simple_name
  tag_encoded
end

Public Instance Methods

acceptable?(_value) click to toggle source

Public Instance Methods

# File lib/protobuf/field/base_field.rb, line 59
def acceptable?(_value)
  true
end
coerce!(value) click to toggle source
# File lib/protobuf/field/base_field.rb, line 63
def coerce!(value)
  value
end
decode(_bytes) click to toggle source
# File lib/protobuf/field/base_field.rb, line 67
def decode(_bytes)
  fail NotImplementedError, "#{self.class.name}##{__method__}"
end
default() click to toggle source
# File lib/protobuf/field/base_field.rb, line 71
def default
  options[:default]
end
default_value() click to toggle source
# File lib/protobuf/field/base_field.rb, line 75
def default_value
  @default_value ||= if optional? || required?
                       typed_default_value
                     elsif repeated?
                       ::Protobuf::Field::FieldArray.new(self).freeze
                     else
                       fail "Unknown field label -- something went very wrong"
                     end
end
deprecated?() click to toggle source
# File lib/protobuf/field/base_field.rb, line 85
def deprecated?
  options.key?(:deprecated)
end
encode(_value) click to toggle source
# File lib/protobuf/field/base_field.rb, line 89
def encode(_value)
  fail NotImplementedError, "#{self.class.name}##{__method__}"
end
enum?() click to toggle source
# File lib/protobuf/field/base_field.rb, line 97
def enum?
  false
end
extension?() click to toggle source
# File lib/protobuf/field/base_field.rb, line 93
def extension?
  options.key?(:extension)
end
fully_qualified_name_only!() click to toggle source
# File lib/protobuf/field/base_field.rb, line 164
def fully_qualified_name_only!
  @name = @fully_qualified_name
end
message?() click to toggle source
# File lib/protobuf/field/base_field.rb, line 101
def message?
  false
end
optional?() click to toggle source
# File lib/protobuf/field/base_field.rb, line 105
def optional?
  rule == :optional
end
packed?() click to toggle source
# File lib/protobuf/field/base_field.rb, line 109
def packed?
  repeated? && options.key?(:packed)
end
repeated?() click to toggle source
# File lib/protobuf/field/base_field.rb, line 113
def repeated?
  rule == :repeated
end
repeated_message?() click to toggle source
# File lib/protobuf/field/base_field.rb, line 117
def repeated_message?
  repeated? && message?
end
required?() click to toggle source
# File lib/protobuf/field/base_field.rb, line 121
def required?
  rule == :required
end
set(message_instance, bytes) click to toggle source

FIXME: need to cleanup (rename) this warthog of a method.

# File lib/protobuf/field/base_field.rb, line 126
def set(message_instance, bytes)
  return message_instance[name] = decode(bytes) unless repeated?
  return message_instance[name] << decode(bytes) unless packed?

  array = message_instance[name]
  stream = StringIO.new(bytes)

  if wire_type == ::Protobuf::WireType::VARINT
    array << decode(Varint.decode(stream)) until stream.eof?
  elsif wire_type == ::Protobuf::WireType::FIXED64
    array << decode(stream.read(8)) until stream.eof?
  elsif wire_type == ::Protobuf::WireType::FIXED32
    array << decode(stream.read(4)) until stream.eof?
  end
end
tag_encoded() click to toggle source
# File lib/protobuf/field/base_field.rb, line 142
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_s() click to toggle source

FIXME: add packed, deprecated, extension options to to_s output

# File lib/protobuf/field/base_field.rb, line 154
def to_s
  "#{rule} #{type_class} #{name} = #{tag} #{default ? "[default=#{default.inspect}]" : ''}"
end
wire_type() click to toggle source
# File lib/protobuf/field/base_field.rb, line 160
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 174
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 193
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 201
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