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