prepor-protobuf 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rubocop.yml +51 -0
  4. data/.rubocop_todo.yml +89 -0
  5. data/.travis.yml +25 -0
  6. data/.yardopts +5 -0
  7. data/CHANGES.md +256 -0
  8. data/CONTRIBUTING.md +16 -0
  9. data/Gemfile +3 -0
  10. data/LICENSE.txt +22 -0
  11. data/README.md +33 -0
  12. data/Rakefile +64 -0
  13. data/bin/protoc-gen-ruby +16 -0
  14. data/bin/rpc_server +5 -0
  15. data/install-protobuf.sh +28 -0
  16. data/lib/protobuf.rb +100 -0
  17. data/lib/protobuf/cli.rb +242 -0
  18. data/lib/protobuf/code_generator.rb +44 -0
  19. data/lib/protobuf/decoder.rb +73 -0
  20. data/lib/protobuf/deprecation.rb +112 -0
  21. data/lib/protobuf/descriptors.rb +3 -0
  22. data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +48 -0
  23. data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +251 -0
  24. data/lib/protobuf/encoder.rb +67 -0
  25. data/lib/protobuf/enum.rb +303 -0
  26. data/lib/protobuf/exceptions.rb +9 -0
  27. data/lib/protobuf/field.rb +74 -0
  28. data/lib/protobuf/field/base_field.rb +267 -0
  29. data/lib/protobuf/field/bool_field.rb +59 -0
  30. data/lib/protobuf/field/bytes_field.rb +82 -0
  31. data/lib/protobuf/field/double_field.rb +25 -0
  32. data/lib/protobuf/field/enum_field.rb +68 -0
  33. data/lib/protobuf/field/field_array.rb +87 -0
  34. data/lib/protobuf/field/fixed32_field.rb +25 -0
  35. data/lib/protobuf/field/fixed64_field.rb +28 -0
  36. data/lib/protobuf/field/float_field.rb +41 -0
  37. data/lib/protobuf/field/int32_field.rb +21 -0
  38. data/lib/protobuf/field/int64_field.rb +21 -0
  39. data/lib/protobuf/field/integer_field.rb +23 -0
  40. data/lib/protobuf/field/message_field.rb +65 -0
  41. data/lib/protobuf/field/sfixed32_field.rb +27 -0
  42. data/lib/protobuf/field/sfixed64_field.rb +28 -0
  43. data/lib/protobuf/field/signed_integer_field.rb +29 -0
  44. data/lib/protobuf/field/sint32_field.rb +21 -0
  45. data/lib/protobuf/field/sint64_field.rb +21 -0
  46. data/lib/protobuf/field/string_field.rb +34 -0
  47. data/lib/protobuf/field/uint32_field.rb +21 -0
  48. data/lib/protobuf/field/uint64_field.rb +21 -0
  49. data/lib/protobuf/field/varint_field.rb +73 -0
  50. data/lib/protobuf/generators/base.rb +70 -0
  51. data/lib/protobuf/generators/enum_generator.rb +41 -0
  52. data/lib/protobuf/generators/extension_generator.rb +27 -0
  53. data/lib/protobuf/generators/field_generator.rb +131 -0
  54. data/lib/protobuf/generators/file_generator.rb +135 -0
  55. data/lib/protobuf/generators/group_generator.rb +112 -0
  56. data/lib/protobuf/generators/message_generator.rb +98 -0
  57. data/lib/protobuf/generators/printable.rb +160 -0
  58. data/lib/protobuf/generators/service_generator.rb +26 -0
  59. data/lib/protobuf/lifecycle.rb +33 -0
  60. data/lib/protobuf/logging.rb +39 -0
  61. data/lib/protobuf/message.rb +193 -0
  62. data/lib/protobuf/message/fields.rb +133 -0
  63. data/lib/protobuf/message/serialization.rb +89 -0
  64. data/lib/protobuf/optionable.rb +23 -0
  65. data/lib/protobuf/rpc/buffer.rb +77 -0
  66. data/lib/protobuf/rpc/client.rb +168 -0
  67. data/lib/protobuf/rpc/connector.rb +19 -0
  68. data/lib/protobuf/rpc/connectors/base.rb +55 -0
  69. data/lib/protobuf/rpc/connectors/common.rb +176 -0
  70. data/lib/protobuf/rpc/connectors/socket.rb +73 -0
  71. data/lib/protobuf/rpc/connectors/zmq.rb +322 -0
  72. data/lib/protobuf/rpc/dynamic_discovery.pb.rb +49 -0
  73. data/lib/protobuf/rpc/env.rb +58 -0
  74. data/lib/protobuf/rpc/error.rb +28 -0
  75. data/lib/protobuf/rpc/error/client_error.rb +31 -0
  76. data/lib/protobuf/rpc/error/server_error.rb +43 -0
  77. data/lib/protobuf/rpc/middleware.rb +25 -0
  78. data/lib/protobuf/rpc/middleware/exception_handler.rb +36 -0
  79. data/lib/protobuf/rpc/middleware/logger.rb +91 -0
  80. data/lib/protobuf/rpc/middleware/request_decoder.rb +83 -0
  81. data/lib/protobuf/rpc/middleware/response_encoder.rb +88 -0
  82. data/lib/protobuf/rpc/middleware/runner.rb +18 -0
  83. data/lib/protobuf/rpc/rpc.pb.rb +55 -0
  84. data/lib/protobuf/rpc/server.rb +39 -0
  85. data/lib/protobuf/rpc/servers/socket/server.rb +123 -0
  86. data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
  87. data/lib/protobuf/rpc/servers/socket_runner.rb +40 -0
  88. data/lib/protobuf/rpc/servers/zmq/broker.rb +193 -0
  89. data/lib/protobuf/rpc/servers/zmq/server.rb +320 -0
  90. data/lib/protobuf/rpc/servers/zmq/util.rb +48 -0
  91. data/lib/protobuf/rpc/servers/zmq/worker.rb +104 -0
  92. data/lib/protobuf/rpc/servers/zmq_runner.rb +62 -0
  93. data/lib/protobuf/rpc/service.rb +179 -0
  94. data/lib/protobuf/rpc/service_directory.rb +253 -0
  95. data/lib/protobuf/rpc/service_dispatcher.rb +46 -0
  96. data/lib/protobuf/rpc/service_filters.rb +272 -0
  97. data/lib/protobuf/rpc/stat.rb +97 -0
  98. data/lib/protobuf/socket.rb +21 -0
  99. data/lib/protobuf/tasks.rb +1 -0
  100. data/lib/protobuf/tasks/compile.rake +61 -0
  101. data/lib/protobuf/version.rb +3 -0
  102. data/lib/protobuf/wire_type.rb +10 -0
  103. data/lib/protobuf/zmq.rb +21 -0
  104. data/proto/dynamic_discovery.proto +44 -0
  105. data/proto/google/protobuf/compiler/plugin.proto +147 -0
  106. data/proto/google/protobuf/descriptor.proto +620 -0
  107. data/proto/rpc.proto +62 -0
  108. data/protobuf.gemspec +51 -0
  109. data/spec/benchmark/tasks.rb +139 -0
  110. data/spec/bin/protoc-gen-ruby_spec.rb +23 -0
  111. data/spec/data/data.bin +3 -0
  112. data/spec/data/types.bin +0 -0
  113. data/spec/encoding/all_types_spec.rb +105 -0
  114. data/spec/encoding/extreme_values_spec.rb +0 -0
  115. data/spec/functional/class_inheritance_spec.rb +52 -0
  116. data/spec/functional/socket_server_spec.rb +59 -0
  117. data/spec/functional/zmq_server_spec.rb +105 -0
  118. data/spec/lib/protobuf/cli_spec.rb +273 -0
  119. data/spec/lib/protobuf/code_generator_spec.rb +60 -0
  120. data/spec/lib/protobuf/enum_spec.rb +265 -0
  121. data/spec/lib/protobuf/field/bool_field_spec.rb +51 -0
  122. data/spec/lib/protobuf/field/field_array_spec.rb +69 -0
  123. data/spec/lib/protobuf/field/float_field_spec.rb +55 -0
  124. data/spec/lib/protobuf/field/int32_field_spec.rb +89 -0
  125. data/spec/lib/protobuf/field/string_field_spec.rb +45 -0
  126. data/spec/lib/protobuf/field_spec.rb +191 -0
  127. data/spec/lib/protobuf/generators/base_spec.rb +84 -0
  128. data/spec/lib/protobuf/generators/enum_generator_spec.rb +73 -0
  129. data/spec/lib/protobuf/generators/extension_generator_spec.rb +42 -0
  130. data/spec/lib/protobuf/generators/field_generator_spec.rb +102 -0
  131. data/spec/lib/protobuf/generators/file_generator_spec.rb +32 -0
  132. data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
  133. data/spec/lib/protobuf/generators/service_generator_spec.rb +46 -0
  134. data/spec/lib/protobuf/lifecycle_spec.rb +94 -0
  135. data/spec/lib/protobuf/message_spec.rb +526 -0
  136. data/spec/lib/protobuf/optionable_spec.rb +46 -0
  137. data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
  138. data/spec/lib/protobuf/rpc/connector_spec.rb +26 -0
  139. data/spec/lib/protobuf/rpc/connectors/base_spec.rb +50 -0
  140. data/spec/lib/protobuf/rpc/connectors/common_spec.rb +170 -0
  141. data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +36 -0
  142. data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +117 -0
  143. data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
  144. data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
  145. data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
  146. data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +75 -0
  147. data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
  148. data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +43 -0
  149. data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +55 -0
  150. data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +35 -0
  151. data/spec/lib/protobuf/rpc/service_directory_spec.rb +293 -0
  152. data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +52 -0
  153. data/spec/lib/protobuf/rpc/service_filters_spec.rb +517 -0
  154. data/spec/lib/protobuf/rpc/service_spec.rb +162 -0
  155. data/spec/lib/protobuf/rpc/stat_spec.rb +68 -0
  156. data/spec/lib/protobuf_spec.rb +98 -0
  157. data/spec/spec_helper.rb +44 -0
  158. data/spec/support/all.rb +6 -0
  159. data/spec/support/packed_field.rb +22 -0
  160. data/spec/support/server.rb +64 -0
  161. data/spec/support/test/all_types.data.bin +0 -0
  162. data/spec/support/test/all_types.data.txt +119 -0
  163. data/spec/support/test/defaults.pb.rb +27 -0
  164. data/spec/support/test/defaults.proto +9 -0
  165. data/spec/support/test/enum.pb.rb +55 -0
  166. data/spec/support/test/enum.proto +34 -0
  167. data/spec/support/test/extended.pb.rb +18 -0
  168. data/spec/support/test/extended.proto +10 -0
  169. data/spec/support/test/extreme_values.data.bin +0 -0
  170. data/spec/support/test/google_unittest.pb.rb +537 -0
  171. data/spec/support/test/google_unittest.proto +713 -0
  172. data/spec/support/test/google_unittest_import.pb.rb +39 -0
  173. data/spec/support/test/google_unittest_import.proto +64 -0
  174. data/spec/support/test/google_unittest_import_public.pb.rb +10 -0
  175. data/spec/support/test/google_unittest_import_public.proto +38 -0
  176. data/spec/support/test/multi_field_extensions.pb.rb +58 -0
  177. data/spec/support/test/multi_field_extensions.proto +33 -0
  178. data/spec/support/test/resource.pb.rb +119 -0
  179. data/spec/support/test/resource.proto +94 -0
  180. data/spec/support/test/resource_service.rb +23 -0
  181. data/spec/support/test_app_file.rb +2 -0
  182. metadata +502 -0
@@ -0,0 +1,67 @@
1
+ module Protobuf
2
+ class Encoder
3
+
4
+ def self.encode(stream, message)
5
+ new(stream, message).encode
6
+ end
7
+
8
+ private
9
+
10
+ attr_writer :message, :stream
11
+
12
+ public
13
+
14
+ attr_reader :message, :stream
15
+
16
+ def initialize(message, stream)
17
+ unless message.respond_to?(:each_field_for_serialization)
18
+ fail ArgumentError, "Message instance must respond to :each_field_for_serialization"
19
+ end
20
+
21
+ self.message = message
22
+ self.stream = stream
23
+ end
24
+
25
+ def encode
26
+ message.each_field_for_serialization do |field, value|
27
+ encode_field(field, value)
28
+ end
29
+
30
+ stream
31
+ end
32
+
33
+ private
34
+
35
+ def encode_field(field, value)
36
+ if field.repeated?
37
+ encode_repeated_field(field, value)
38
+ else
39
+ write_pair(field, value)
40
+ end
41
+ end
42
+
43
+ def encode_packed_field(field, value)
44
+ key = (field.tag << 3) | ::Protobuf::WireType::LENGTH_DELIMITED
45
+ packed_value = value.map { |val| field.encode(val) }.join
46
+ stream << ::Protobuf::Field::VarintField.encode(key)
47
+ stream << ::Protobuf::Field::VarintField.encode(packed_value.size)
48
+ stream << packed_value
49
+ end
50
+
51
+ def encode_repeated_field(field, value)
52
+ if field.packed?
53
+ encode_packed_field(field, value)
54
+ else
55
+ value.each { |val| write_pair(field, val) }
56
+ end
57
+ end
58
+
59
+ # Encode key and value, and write to +stream+.
60
+ def write_pair(field, value)
61
+ key = (field.tag << 3) | field.wire_type
62
+ stream << ::Protobuf::Field::VarintField.encode(key)
63
+ stream << field.encode(value)
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,303 @@
1
+ require 'delegate'
2
+ require 'protobuf/optionable'
3
+
4
+ ##
5
+ # Adding extension to Numeric until
6
+ # we can get people to stop calling #value
7
+ # on Enum instances.
8
+ #
9
+ ::Protobuf.deprecator.define_deprecated_methods(Numeric, :value => :to_int)
10
+
11
+ module Protobuf
12
+ class Enum < SimpleDelegator
13
+ # Public: Allows setting Options on the Enum class.
14
+ include ::Protobuf::Optionable
15
+
16
+ def self.aliases_allowed?
17
+ get_option(:allow_alias)
18
+ end
19
+
20
+ # Public: Get all integer tags defined by this enum.
21
+ #
22
+ # Examples
23
+ #
24
+ # class StateMachine < ::Protobuf::Enum
25
+ # set_option :allow_alias
26
+ # define :ON, 1
27
+ # define :STARTED, 1
28
+ # define :OFF, 2
29
+ # end
30
+ #
31
+ # StateMachine.all_tags #=> [ 1, 2 ]
32
+ #
33
+ # Returns an array of unique integers.
34
+ #
35
+ def self.all_tags
36
+ @all_tags ||= enums.map(&:to_i).uniq
37
+ end
38
+
39
+ # Internal: DSL method to create a new Enum. The given name will
40
+ # become a constant for this Enum pointing to the new instance.
41
+ #
42
+ # Examples
43
+ #
44
+ # class StateMachine < ::Protobuf::Enum
45
+ # define :ON, 1
46
+ # define :OFF, 2
47
+ # end
48
+ #
49
+ # StateMachine::ON #=> #<StateMachine::ON=1>
50
+ # StateMachine::OFF #=> #<StateMachine::OFF=2>
51
+ #
52
+ # Returns nothing.
53
+ #
54
+ def self.define(name, tag)
55
+ enum = new(self, name, tag)
56
+ @enums ||= []
57
+ @enums << enum
58
+ const_set(name, enum)
59
+ end
60
+
61
+ # Public: All defined enums.
62
+ #
63
+ class << self
64
+ attr_reader :enums
65
+ end
66
+
67
+ # Public: Get an array of Enum objects with the given tag.
68
+ #
69
+ # tag - An object that responds to to_i.
70
+ #
71
+ # Examples
72
+ #
73
+ # class StateMachine < ::Protobuf::Enum
74
+ # set_option :allow_alias
75
+ # define :ON, 1
76
+ # define :STARTED, 1
77
+ # define :OFF, 2
78
+ # end
79
+ #
80
+ # StateMachine.enums_for_tag(1) #=> [ #<StateMachine::ON=1>, #<StateMachine::STARTED=1> ]
81
+ # StateMachine.enums_for_tag(2) #=> [ #<StateMachine::OFF=2> ]
82
+ #
83
+ # Returns an array with zero or more Enum objects or nil.
84
+ #
85
+ def self.enums_for_tag(tag)
86
+ enums.select do |enum|
87
+ enum.to_i == tag.to_i
88
+ end
89
+ end
90
+
91
+ # Public: Get the Enum associated with the given name.
92
+ #
93
+ # name - A string-like object. Case-sensitive.
94
+ #
95
+ # Example
96
+ #
97
+ # class StateMachine < ::Protobuf::Enum
98
+ # define :ON, 1
99
+ # define :OFF, 2
100
+ # end
101
+ #
102
+ # StateMachine.enum_for_name(:ON) # => #<StateMachine::ON=1>
103
+ # StateMachine.enum_for_name("ON") # => #<StateMachine::ON=1>
104
+ # StateMachine.enum_for_name(:on) # => nil
105
+ # StateMachine.enum_for_name(:FOO) # => nil
106
+ #
107
+ # Returns the Enum object with the given name or nil.
108
+ #
109
+ def self.enum_for_name(name)
110
+ const_get(name)
111
+ rescue ::NameError
112
+ nil
113
+ end
114
+
115
+ # Public: Get the Enum object corresponding to the given tag.
116
+ #
117
+ # tag - An object that responds to to_i.
118
+ #
119
+ # Returns an Enum object or nil. If the tag corresponds to multiple
120
+ # Enums, the first enum defined will be returned.
121
+ #
122
+ def self.enum_for_tag(tag)
123
+ enums_for_tag(tag).first
124
+ end
125
+
126
+ # Public: Get an Enum by a variety of type-checking mechanisms.
127
+ #
128
+ # candidate - An Enum, Numeric, String, or Symbol object.
129
+ #
130
+ # Example
131
+ #
132
+ # class StateMachine < ::Protobuf::Enum
133
+ # set_option :allow_alias
134
+ # define :ON, 1
135
+ # define :STARTED, 1
136
+ # define :OFF, 2
137
+ # end
138
+ #
139
+ # StateMachine.fetch(StateMachine::ON) # => #<StateMachine::ON=1>
140
+ # StateMachine.fetch(:ON) # => #<StateMachine::ON=1>
141
+ # StateMachine.fetch("STARTED") # => #<StateMachine::STARTED=1>
142
+ # StateMachine.fetch(1) # => [ #<StateMachine::ON=1>, #<StateMachine::STARTED=1> ]
143
+ #
144
+ # Returns an Enum object or nil.
145
+ #
146
+ def self.fetch(candidate)
147
+ case candidate
148
+ when self then
149
+ candidate
150
+ when ::Numeric then
151
+ enum_for_tag(candidate.to_i)
152
+ when ::String, ::Symbol then
153
+ enum_for_name(candidate)
154
+ else
155
+ nil
156
+ end
157
+ end
158
+
159
+ # Public: Get the Symbol name associated with the given number.
160
+ #
161
+ # number - An object that responds to to_i.
162
+ #
163
+ # Examples
164
+ #
165
+ # # Without aliases
166
+ # class StateMachine < ::Protobuf::Enum
167
+ # define :ON, 1
168
+ # define :OFF, 2
169
+ # end
170
+ #
171
+ # StateMachine.name_for_tag(1) # => :ON
172
+ # StateMachine.name_for_tag(2) # => :OFF
173
+ # StateMachine.name_for_tag(3) # => nil
174
+ #
175
+ # # With aliases
176
+ # class StateMachine < ::Protobuf::Enum
177
+ # set_option :allow_alias
178
+ # define :STARTED, 1
179
+ # define :ON, 1
180
+ # define :OFF, 2
181
+ # end
182
+ #
183
+ # StateMachine.name_for_tag(1) # => :STARTED
184
+ # StateMachine.name_for_tag(2) # => :OFF
185
+ #
186
+ # Returns the symbol name of the enum constant given it's associated tag or nil.
187
+ # If the given tag has multiple names associated (due to allow_alias)
188
+ # the first defined name will be returned.
189
+ #
190
+ def self.name_for_tag(tag)
191
+ enum_for_tag(tag).try(:name)
192
+ end
193
+
194
+ # Public: Check if the given tag is defined by this Enum.
195
+ #
196
+ # number - An object that responds to to_i.
197
+ #
198
+ # Returns a boolean.
199
+ #
200
+ def self.valid_tag?(tag)
201
+ tag.respond_to?(:to_i) && all_tags.include?(tag.to_i)
202
+ end
203
+
204
+ # Public: [DEPRECATED] Return a hash of Enum objects keyed
205
+ # by their :name.
206
+ #
207
+ def self.values
208
+ @values ||= enums.each_with_object({}) do |enum, hash|
209
+ hash[enum.name] = enum
210
+ end
211
+ end
212
+
213
+ ##
214
+ # Class Deprecations
215
+ #
216
+ class << self
217
+ ::Protobuf.deprecator.define_deprecated_methods(
218
+ self,
219
+ :enum_by_value => :enum_for_tag,
220
+ :name_by_value => :name_for_tag,
221
+ :get_name_by_tag => :name_for_tag,
222
+ :value_by_name => :enum_for_name,
223
+ )
224
+
225
+ ::Protobuf.deprecator.deprecate_methods(self, :values => :enums)
226
+ end
227
+
228
+ ##
229
+ # Attributes
230
+ #
231
+
232
+ private
233
+
234
+ attr_writer :parent_class, :name, :tag
235
+
236
+ public
237
+
238
+ attr_reader :parent_class, :name, :tag
239
+
240
+ ##
241
+ # Instance Methods
242
+ #
243
+
244
+ def initialize(parent_class, name, tag)
245
+ self.parent_class = parent_class
246
+ self.name = name
247
+ self.tag = tag
248
+ super(tag)
249
+ end
250
+
251
+ # Overriding the class so ActiveRecord/Arel visitor will visit the enum as a Fixnum
252
+ #
253
+ def class
254
+ Fixnum
255
+ end
256
+
257
+ def inspect
258
+ "\#<Protobuf::Enum(#{parent_class})::#{name}=#{tag}>"
259
+ end
260
+
261
+ def to_i
262
+ tag
263
+ end
264
+
265
+ def to_int
266
+ tag.to_int
267
+ end
268
+
269
+ def to_s(format = :tag)
270
+ case format
271
+ when :tag then
272
+ to_i.to_s
273
+ when :name then
274
+ name.to_s
275
+ else
276
+ to_i.to_s
277
+ end
278
+ end
279
+
280
+ # Re-implement `try` in order to fix the problem where
281
+ # the underlying fixnum doesn't respond to all methods (e.g. name or tag).
282
+ # If we respond to the first argument, `__send__` the args. Otherwise,
283
+ # delegate the `try` call to the underlying vlaue fixnum.
284
+ #
285
+ def try(*args, &block)
286
+ case
287
+ when args.empty? && block_given?
288
+ yield self
289
+ when respond_to?(args.first)
290
+ __send__(*args, &block)
291
+ else
292
+ @tag.try(*args, &block)
293
+ end
294
+ end
295
+
296
+ ::Protobuf.deprecator.define_deprecated_methods(self, :value => :to_i)
297
+
298
+ ##
299
+ # Instance Aliases
300
+ #
301
+ alias_method :to_hash_value, :to_i
302
+ end
303
+ end
@@ -0,0 +1,9 @@
1
+ module Protobuf
2
+ class Error < StandardError; end
3
+ class InvalidWireType < Error; end
4
+ class NotInitializedError < Error; end
5
+ class TagCollisionError < Error; end
6
+ class SerializationError < StandardError; end
7
+ class FieldNotDefinedError < StandardError; end
8
+ class DuplicateFieldNameError < StandardError; end
9
+ end
@@ -0,0 +1,74 @@
1
+ require 'protobuf/field/base_field'
2
+ require 'protobuf/field/bytes_field'
3
+ require 'protobuf/field/float_field'
4
+ require 'protobuf/field/message_field'
5
+ require 'protobuf/field/varint_field'
6
+ require 'protobuf/field/string_field'
7
+ require 'protobuf/field/double_field'
8
+ require 'protobuf/field/enum_field'
9
+ require 'protobuf/field/integer_field'
10
+ require 'protobuf/field/signed_integer_field'
11
+ require 'protobuf/field/uint32_field'
12
+ require 'protobuf/field/uint64_field'
13
+ require 'protobuf/field/int32_field'
14
+ require 'protobuf/field/int64_field'
15
+ require 'protobuf/field/sint32_field'
16
+ require 'protobuf/field/sint64_field'
17
+ require 'protobuf/field/bool_field'
18
+ require 'protobuf/field/sfixed32_field'
19
+ require 'protobuf/field/sfixed64_field'
20
+ require 'protobuf/field/fixed32_field'
21
+ require 'protobuf/field/fixed64_field'
22
+
23
+ module Protobuf
24
+ module Field
25
+
26
+ PRIMITIVE_FIELD_MAP = {
27
+ :double => ::Protobuf::Field::DoubleField,
28
+ :float => ::Protobuf::Field::FloatField,
29
+ :int32 => ::Protobuf::Field::Int32Field,
30
+ :int64 => ::Protobuf::Field::Int64Field,
31
+ :uint32 => ::Protobuf::Field::Uint32Field,
32
+ :uint64 => ::Protobuf::Field::Uint64Field,
33
+ :sint32 => ::Protobuf::Field::Sint32Field,
34
+ :sint64 => ::Protobuf::Field::Sint64Field,
35
+ :fixed32 => ::Protobuf::Field::Fixed32Field,
36
+ :fixed64 => ::Protobuf::Field::Fixed64Field,
37
+ :sfixed32 => ::Protobuf::Field::Sfixed32Field,
38
+ :sfixed64 => ::Protobuf::Field::Sfixed64Field,
39
+ :string => ::Protobuf::Field::StringField,
40
+ :bytes => ::Protobuf::Field::BytesField,
41
+ :bool => ::Protobuf::Field::BoolField,
42
+ }.freeze
43
+
44
+ def self.build(message_class, rule, type, name, tag, options = {})
45
+ field_class(type).new(message_class, rule, field_type(type), name, tag, options)
46
+ end
47
+
48
+ # Returns the field class for primitives,
49
+ # EnumField for types that inherit from Protobuf::Enum,
50
+ # and MessageField for types that inherit from Protobuf::Message.
51
+ #
52
+ def self.field_class(type)
53
+ if PRIMITIVE_FIELD_MAP.key?(type)
54
+ PRIMITIVE_FIELD_MAP[type]
55
+ elsif type < ::Protobuf::Enum
56
+ EnumField
57
+ elsif type < ::Protobuf::Message
58
+ MessageField
59
+ elsif type < ::Protobuf::Field::BaseField
60
+ type
61
+ else
62
+ fail ArgumentError, "Invalid field type #{type}"
63
+ end
64
+ end
65
+
66
+ # Returns the mapped type for primitives,
67
+ # otherwise the given type is returned.
68
+ #
69
+ def self.field_type(type)
70
+ PRIMITIVE_FIELD_MAP.fetch(type) { type }
71
+ end
72
+
73
+ end
74
+ end