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, logger, logger=, #sign_message

Constructor Details

#initialize(message_class, rule, type_class, name, tag, options) ⇒ BaseField

Constructor



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/protobuf/field/base_field.rb', line 38

def initialize(message_class, rule, type_class, name, tag, options)
  @message_class = message_class
  @name          = name
  @rule          = rule
  @tag           = tag
  @type_class    = type_class
  @options       = options

  validate_packed_field if packed?
  define_accessor
end

Instance Attribute Details

#message_classObject (readonly)

Attributes



24
25
26
# File 'lib/protobuf/field/base_field.rb', line 24

def message_class
  @message_class
end

#nameObject (readonly)

Attributes



24
25
26
# File 'lib/protobuf/field/base_field.rb', line 24

def name
  @name
end

#optionsObject (readonly)

Attributes



24
25
26
# File 'lib/protobuf/field/base_field.rb', line 24

def options
  @options
end

#ruleObject (readonly)

Attributes



24
25
26
# File 'lib/protobuf/field/base_field.rb', line 24

def rule
  @rule
end

#tagObject (readonly)

Attributes



24
25
26
# File 'lib/protobuf/field/base_field.rb', line 24

def tag
  @tag
end

#type_classObject (readonly)

Attributes



24
25
26
# File 'lib/protobuf/field/base_field.rb', line 24

def type_class
  @type_class
end

Class Method Details

.defaultObject

Class Methods



30
31
32
# File 'lib/protobuf/field/base_field.rb', line 30

def self.default
  nil
end

Instance Method Details

#acceptable?(value) ⇒ Boolean

Public Instance Methods

Returns:

  • (Boolean)


54
55
56
# File 'lib/protobuf/field/base_field.rb', line 54

def acceptable?(value)
  true
end

#coerce!(value) ⇒ Object



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

def coerce!(value)
  value
end

#decode(bytes) ⇒ Object

Raises:

  • (NotImplementedError)


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

def decode(bytes)
  raise NotImplementedError, "#{self.class.name}\#decode"
end

#defaultObject



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

def default
  options[:default]
end

#default_valueObject



70
71
72
73
74
75
76
# File 'lib/protobuf/field/base_field.rb', line 70

def default_value
  @default_value ||= case
                     when repeated? then ::Protobuf::Field::FieldArray.new(self).freeze
                     when required? then nil
                     when optional? then typed_default_value
                     end
end

#deprecated?Boolean

Returns:

  • (Boolean)


78
79
80
# File 'lib/protobuf/field/base_field.rb', line 78

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

#encode(value) ⇒ Object

Raises:

  • (NotImplementedError)


82
83
84
# File 'lib/protobuf/field/base_field.rb', line 82

def encode(value)
  raise NotImplementedError, "#{self.class.name}\#encode"
end

#enum?Boolean

Returns:

  • (Boolean)


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

def enum?
  false
end

#extension?Boolean

Returns:

  • (Boolean)


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

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

#getterObject



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

def getter
  name
end

#message?Boolean

Returns:

  • (Boolean)


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

def message?
  false
end

#optional?Boolean

Returns:

  • (Boolean)


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

def optional?
  rule == :optional
end

#packed?Boolean

Returns:

  • (Boolean)


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

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

#repeated?Boolean

Returns:

  • (Boolean)


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

def repeated?
  rule == :repeated
end

#repeated_message?Boolean

Returns:

  • (Boolean)


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

def repeated_message?
  repeated? && message?
end

#required?Boolean

Returns:

  • (Boolean)


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

def required?
  rule == :required
end

#set(message_instance, bytes) ⇒ Object

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



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/protobuf/field/base_field.rb', line 123

def set(message_instance, bytes)
  if packed?
    array = message_instance.__send__(getter)
    method = \
      case wire_type
      when ::Protobuf::WireType::FIXED32 then :read_fixed32
      when ::Protobuf::WireType::FIXED64 then :read_fixed64
      when ::Protobuf::WireType::VARINT  then :read_varint
      end
    stream = StringIO.new(bytes)

    until stream.eof?
      array << decode(::Protobuf::Decoder.__send__(method, stream))
    end
  else
    value = decode(bytes)
    if repeated?
      message_instance.__send__(getter) << value
    else
      message_instance.__send__(setter, value)
    end
  end
end

#setterObject



147
148
149
# File 'lib/protobuf/field/base_field.rb', line 147

def setter
  @setter ||= "#{name}="
end

#to_sObject

FIXME add packed, deprecated, extension options to to_s output



152
153
154
# File 'lib/protobuf/field/base_field.rb', line 152

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

#typeObject



156
157
158
159
# File 'lib/protobuf/field/base_field.rb', line 156

def type
  $stderr.puts("[DEPRECATED] #{self.class.name}#type usage is deprecated.\nPlease use #type_class instead.")
  type_class
end

#warn_if_deprecatedObject



161
162
163
164
165
# File 'lib/protobuf/field/base_field.rb', line 161

def warn_if_deprecated
  if ::Protobuf.print_deprecation_warnings? && deprecated?
    $stderr.puts("[WARNING] #{message_class.name}##{name} field usage is deprecated.")
  end
end

#wire_typeObject



167
168
169
# File 'lib/protobuf/field/base_field.rb', line 167

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