Class: Protobuf::Field::BaseField

Inherits:
Object
  • Object
show all
Defined in:
lib/protobuf/message/field.rb

Direct Known Subclasses

BytesField, MessageField, StringField, VarintField

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(message_class, rule, type, name, tag, opts = {}) ⇒ BaseField



35
36
37
38
39
# File 'lib/protobuf/message/field.rb', line 35

def initialize(message_class, rule, type, name, tag, opts={})
  @message_class, @rule, @type, @name, @tag, @default, @extension = 
    message_class, rule, type, name, tag, opts[:default], opts[:extension]
  @error_message = 'Type invalid'
end

Instance Attribute Details

#defaultObject

Returns the value of attribute default.



29
30
31
# File 'lib/protobuf/message/field.rb', line 29

def default
  @default
end

#message_classObject

Returns the value of attribute message_class.



29
30
31
# File 'lib/protobuf/message/field.rb', line 29

def message_class
  @message_class
end

#nameObject

Returns the value of attribute name.



29
30
31
# File 'lib/protobuf/message/field.rb', line 29

def name
  @name
end

#ruleObject

Returns the value of attribute rule.



29
30
31
# File 'lib/protobuf/message/field.rb', line 29

def rule
  @rule
end

#tagObject

Returns the value of attribute tag.



29
30
31
# File 'lib/protobuf/message/field.rb', line 29

def tag
  @tag
end

#typeObject

Returns the value of attribute type.



29
30
31
# File 'lib/protobuf/message/field.rb', line 29

def type
  @type
end

Class Method Details

.defaultObject



26
# File 'lib/protobuf/message/field.rb', line 26

def default; nil end

.descriptorObject



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

def descriptor
  @descriptor ||= Protobuf::Descriptor::FieldDescriptor.new
end

Instance Method Details

#acceptable?(val) ⇒ Boolean



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

def acceptable?(val)
  true
end

#clear(message) ⇒ Object



58
59
60
61
62
63
64
# File 'lib/protobuf/message/field.rb', line 58

def clear(message)
  if repeated?
    message[name].clear
  else
    message.instance_variable_get(:@values).delete(name)
  end
end

#default_valueObject



66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/protobuf/message/field.rb', line 66

def default_value
  case rule
  when :repeated
    FieldArray.new self
  when :required
    nil
  when :optional
    typed_default_value default
  else
    raise InvalidRuleError
  end
end

#define_accessor(message_instance) ⇒ Object



83
84
85
86
87
# File 'lib/protobuf/message/field.rb', line 83

def define_accessor(message_instance)
  message_instance.instance_variable_get(:@values)[name] = default_value if rule == :repeated
  define_getter message_instance
  define_setter message_instance unless rule == :repeated
end

#define_getter(message_instance) ⇒ Object



89
90
91
92
93
94
95
96
97
# File 'lib/protobuf/message/field.rb', line 89

def define_getter(message_instance)
  field = self
  metaclass = (class << message_instance; self; end)
  metaclass.class_eval do
    define_method(field.name) do
      @values[field.name] or field.default_value
    end
  end
end

#define_setter(message_instance) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/protobuf/message/field.rb', line 99

def define_setter(message_instance)
  field = self
  metaclass = (class << message_instance; self; end)
  metaclass.class_eval do
    define_method("#{field.name}=") do |val|
      if val.nil?
        @values.delete(field.name)
      elsif field.acceptable? val
        @values[field.name] = val
      end
    end
  end
end

#descriptorObject



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

def descriptor
  @descriptor ||= Protobuf::Descriptor::FieldDescriptor.new self
end

#error_messageObject



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

def error_message
  @error_message
end

#get(value) ⇒ Object



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

def get(value)
  get_bytes value
end

#get_bytes(value) ⇒ Object

Raises:

  • (NotImplementedError)


133
134
135
# File 'lib/protobuf/message/field.rb', line 133

def get_bytes(value)
  raise NotImplementedError
end

#initialized?(message) ⇒ Boolean



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

def initialized?(message)
  case rule
  when :required
    return false if message[name].nil?
    return false if is_a?(Protobuf::Field::MessageField) and not message[name].initialized?
  when :repeated
    return message[name].inject(true) do |result, msg|
      result and msg.initialized?
    end
  when :optional
    return false if message[name] and is_a?(Protobuf::Field::MessageField) and not message[name].initialized?
  end
  true
end

#maxObject



157
# File 'lib/protobuf/message/field.rb', line 157

def max; self.class.max end

#merge(message_instance, value) ⇒ Object



137
138
139
140
141
142
143
# File 'lib/protobuf/message/field.rb', line 137

def merge(message_instance, value)
  if repeated?
    merge_array message_instance, value
  else
    merge_value message_instance, value
  end
end

#merge_array(message_instance, value) ⇒ Object



145
146
147
# File 'lib/protobuf/message/field.rb', line 145

def merge_array(message_instance, value)
  message_instance[tag].concat value 
end

#merge_value(message_instance, value) ⇒ Object



149
150
151
# File 'lib/protobuf/message/field.rb', line 149

def merge_value(message_instance, value)
  message_instance[tag] = value
end

#minObject



158
# File 'lib/protobuf/message/field.rb', line 158

def min; self.class.min end

#optional?Boolean



155
# File 'lib/protobuf/message/field.rb', line 155

def optional?; rule == :optional end

#ready?Boolean



41
# File 'lib/protobuf/message/field.rb', line 41

def ready?; true end

#repeated?Boolean



153
# File 'lib/protobuf/message/field.rb', line 153

def repeated?; rule == :repeated end

#required?Boolean



154
# File 'lib/protobuf/message/field.rb', line 154

def required?; rule == :required end

#set(message_instance, bytes) ⇒ Object



113
114
115
116
117
118
119
# File 'lib/protobuf/message/field.rb', line 113

def set(message_instance, bytes)
  if repeated?
    set_array message_instance, bytes
  else
    set_bytes message_instance, bytes
  end
end

#set_array(message_instance, bytes) ⇒ Object

Raises:

  • (NotImplementedError)


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

def set_array(message_instance, bytes)
  raise NotImplementedError
end

#set_bytes(message_instance, bytes) ⇒ Object

Raises:

  • (NotImplementedError)


125
126
127
# File 'lib/protobuf/message/field.rb', line 125

def set_bytes(message_instance, bytes)
  raise NotImplementedError
end

#to_sObject



168
169
170
# File 'lib/protobuf/message/field.rb', line 168

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

#typed_default_value(default = nil) ⇒ Object



79
80
81
# File 'lib/protobuf/message/field.rb', line 79

def typed_default_value(default=nil)
  default or self.class.default
end