Class: Protobuf::Field::BaseField

Inherits:
Object
  • Object
show all
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

Constructor Details

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

Constructor



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/protobuf/field/base_field.rb', line 39

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

  set_rule_predicates

  @getter_method_name = name
  @setter_method_name = "#{name}="
  @default   = options.delete(:default)
  @extension = options.delete(:extension)
  @packed    = repeated? && options.delete(:packed)
  @deprecated = options.delete(:deprecated)

  set_default_value
  warn_excess_options(options) unless options.empty?
  validate_packed_field if packed?
  define_accessor
end

Instance Attribute Details

#defaultObject (readonly)

Attributes



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

def default
  @default
end

#default_valueObject (readonly)

Attributes



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

def default_value
  @default_value
end

#deprecatedObject (readonly)

Attributes



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

def deprecated
  @deprecated
end

#extensionObject (readonly)

Attributes



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

def extension
  @extension
end

#getter_method_nameObject (readonly)

Attributes



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

def getter_method_name
  @getter_method_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

#optionalObject (readonly)

Attributes



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

def optional
  @optional
end

#packedObject (readonly)

Attributes



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

def packed
  @packed
end

#repeatedObject (readonly)

Attributes



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

def repeated
  @repeated
end

#requiredObject (readonly)

Attributes



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

def required
  @required
end

#ruleObject (readonly)

Attributes



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

def rule
  @rule
end

#setter_method_nameObject (readonly)

Attributes



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

def setter_method_name
  @setter_method_name
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



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

def self.default
  nil
end

Instance Method Details

#acceptable?(value) ⇒ Boolean

Public Instance Methods

Returns:

  • (Boolean)


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

def acceptable?(value)
  true
end

#decode(bytes) ⇒ Object

Decode +bytes+ and return a field value.

Raises:

  • (NotImplementedError)


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

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

#deprecated?Boolean

Is this a deprecated field?

Returns:

  • (Boolean)


134
135
136
# File 'lib/protobuf/field/base_field.rb', line 134

def deprecated?
  !! deprecated
end

#encode(value) ⇒ Object

Encode +value+ and return a byte string.

Raises:

  • (NotImplementedError)


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

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

#enum?Boolean

Returns:

  • (Boolean)


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

def enum?
  false
end

#extension?Boolean

Returns:

  • (Boolean)


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

def extension?
  !! extension
end

#message?Boolean

Returns:

  • (Boolean)


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

def message?
  false
end

#optional?Boolean

Is this a optional field?

Returns:

  • (Boolean)


129
130
131
# File 'lib/protobuf/field/base_field.rb', line 129

def optional?
  !! optional
end

#packed?Boolean

Is this a packed repeated field?

Returns:

  • (Boolean)


139
140
141
# File 'lib/protobuf/field/base_field.rb', line 139

def packed?
  !! packed
end

#repeated?Boolean

Is this a repeated field?

Returns:

  • (Boolean)


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

def repeated?
  !! repeated
end

#repeated_message?Boolean

Is this a repeated message field?

Returns:

  • (Boolean)


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

def repeated_message?
  repeated? && message?
end

#required?Boolean

Is this a required field?

Returns:

  • (Boolean)


124
125
126
# File 'lib/protobuf/field/base_field.rb', line 124

def required?
  !! required
end

#set(message_instance, bytes) ⇒ Object

Decode +bytes+ and pass to +message_instance+.



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/protobuf/field/base_field.rb', line 75

def set(message_instance, bytes)
  if packed?
    array = message_instance.__send__(getter_method_name)
    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_method_name) << value
    else
      message_instance.__send__(setter_method_name, value)
    end
  end
end

#to_sObject



143
144
145
# File 'lib/protobuf/field/base_field.rb', line 143

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

#typeObject



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

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

#warn_if_deprecatedObject



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

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