Class: Protobuf::Field::BaseField

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/protobuf/field/base_field.rb

Direct Known Subclasses

BytesField, FloatField, MessageField, VarintField

Constant Summary collapse

PACKED_TYPES =

Constants

[
  ::Protobuf::WireType::VARINT,
  ::Protobuf::WireType::FIXED32,
  ::Protobuf::WireType::FIXED64,
].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

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



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 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

Instance Attribute Details

#fully_qualified_nameObject (readonly)

Attributes



22
23
24
# File 'lib/protobuf/field/base_field.rb', line 22

def fully_qualified_name
  @fully_qualified_name
end

#message_classObject (readonly)

Attributes



22
23
24
# File 'lib/protobuf/field/base_field.rb', line 22

def message_class
  @message_class
end

#nameObject (readonly)

Attributes



22
23
24
# File 'lib/protobuf/field/base_field.rb', line 22

def name
  @name
end

#optionsObject (readonly)

Attributes



22
23
24
# File 'lib/protobuf/field/base_field.rb', line 22

def options
  @options
end

#ruleObject (readonly)

Attributes



22
23
24
# File 'lib/protobuf/field/base_field.rb', line 22

def rule
  @rule
end

#tagObject (readonly)

Attributes



22
23
24
# File 'lib/protobuf/field/base_field.rb', line 22

def tag
  @tag
end

#type_classObject (readonly)

Attributes



22
23
24
# File 'lib/protobuf/field/base_field.rb', line 22

def type_class
  @type_class
end

Class Method Details

.defaultObject

Class Methods



28
29
30
# File 'lib/protobuf/field/base_field.rb', line 28

def self.default
  nil
end

Instance Method Details

#acceptable?(_value) ⇒ Boolean

Public Instance Methods

Returns:

  • (Boolean)


59
60
61
# File 'lib/protobuf/field/base_field.rb', line 59

def acceptable?(_value)
  true
end

#coerce!(value) ⇒ Object



63
64
65
# File 'lib/protobuf/field/base_field.rb', line 63

def coerce!(value)
  value
end

#decode(_bytes) ⇒ Object



67
68
69
# File 'lib/protobuf/field/base_field.rb', line 67

def decode(_bytes)
  fail NotImplementedError, "#{self.class.name}##{__method__}"
end

#defaultObject



71
72
73
# File 'lib/protobuf/field/base_field.rb', line 71

def default
  options[:default]
end

#default_valueObject



75
76
77
78
79
80
81
82
83
# 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?Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/protobuf/field/base_field.rb', line 85

def deprecated?
  options.key?(:deprecated)
end

#encode(_value) ⇒ Object



89
90
91
# File 'lib/protobuf/field/base_field.rb', line 89

def encode(_value)
  fail NotImplementedError, "#{self.class.name}##{__method__}"
end

#enum?Boolean

Returns:

  • (Boolean)


97
98
99
# File 'lib/protobuf/field/base_field.rb', line 97

def enum?
  false
end

#extension?Boolean

Returns:

  • (Boolean)


93
94
95
# File 'lib/protobuf/field/base_field.rb', line 93

def extension?
  options.key?(:extension)
end

#fully_qualified_name_only!Object



164
165
166
# File 'lib/protobuf/field/base_field.rb', line 164

def fully_qualified_name_only!
  @name = @fully_qualified_name
end

#message?Boolean

Returns:

  • (Boolean)


101
102
103
# File 'lib/protobuf/field/base_field.rb', line 101

def message?
  false
end

#optional?Boolean

Returns:

  • (Boolean)


105
106
107
# File 'lib/protobuf/field/base_field.rb', line 105

def optional?
  rule == :optional
end

#packed?Boolean

Returns:

  • (Boolean)


109
110
111
# File 'lib/protobuf/field/base_field.rb', line 109

def packed?
  repeated? && options.key?(:packed)
end

#repeated?Boolean

Returns:

  • (Boolean)


113
114
115
# File 'lib/protobuf/field/base_field.rb', line 113

def repeated?
  rule == :repeated
end

#repeated_message?Boolean

Returns:

  • (Boolean)


117
118
119
# File 'lib/protobuf/field/base_field.rb', line 117

def repeated_message?
  repeated? && message?
end

#required?Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/protobuf/field/base_field.rb', line 121

def required?
  rule == :required
end

#set(message_instance, bytes) ⇒ Object

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



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# 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_encodedObject



142
143
144
145
146
147
148
149
150
151
# 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_sObject

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



154
155
156
# File 'lib/protobuf/field/base_field.rb', line 154

def to_s
  "#{rule} #{type_class} #{name} = #{tag} #{default ? "[default=#{default.inspect}]" : ''}"
end

#wire_typeObject



160
161
162
# File 'lib/protobuf/field/base_field.rb', line 160

def wire_type
  ::Protobuf::WireType::VARINT
end