protostar 0.1.0.beta1

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 (223) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +60 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +647 -0
  5. data/THIRD_PARTY_NOTICES.md +61 -0
  6. data/exe/protoc-gen-protostar +7 -0
  7. data/exe/protostar +7 -0
  8. data/lib/protostar/builder/generator.rb +71 -0
  9. data/lib/protostar/builder/sink.rb +35 -0
  10. data/lib/protostar/builder.rb +965 -0
  11. data/lib/protostar/cli.rb +267 -0
  12. data/lib/protostar/codec/decode_generator.rb +199 -0
  13. data/lib/protostar/codec/decoder.rb +296 -0
  14. data/lib/protostar/codec/encode_generator.rb +224 -0
  15. data/lib/protostar/codec/encoder.rb +121 -0
  16. data/lib/protostar/codec/sizer.rb +91 -0
  17. data/lib/protostar/codec.rb +15 -0
  18. data/lib/protostar/compiler/ast.rb +193 -0
  19. data/lib/protostar/compiler/emitters/descriptor_set.rb +57 -0
  20. data/lib/protostar/compiler/emitters/google_ruby.rb +103 -0
  21. data/lib/protostar/compiler/emitters/grpc.rb +175 -0
  22. data/lib/protostar/compiler/emitters/protostar_rbs.rb +252 -0
  23. data/lib/protostar/compiler/emitters/rbs.rb +394 -0
  24. data/lib/protostar/compiler/emitters/ruby.rb +503 -0
  25. data/lib/protostar/compiler/emitters.rb +268 -0
  26. data/lib/protostar/compiler/include/LICENSE +32 -0
  27. data/lib/protostar/compiler/include/google/protobuf/any.proto +106 -0
  28. data/lib/protostar/compiler/include/google/protobuf/api.proto +229 -0
  29. data/lib/protostar/compiler/include/google/protobuf/compiler/plugin.proto +180 -0
  30. data/lib/protostar/compiler/include/google/protobuf/cpp_features.proto +87 -0
  31. data/lib/protostar/compiler/include/google/protobuf/descriptor.proto +1532 -0
  32. data/lib/protostar/compiler/include/google/protobuf/duration.proto +115 -0
  33. data/lib/protostar/compiler/include/google/protobuf/empty.proto +51 -0
  34. data/lib/protostar/compiler/include/google/protobuf/field_mask.proto +243 -0
  35. data/lib/protostar/compiler/include/google/protobuf/java_features.proto +132 -0
  36. data/lib/protostar/compiler/include/google/protobuf/source_context.proto +48 -0
  37. data/lib/protostar/compiler/include/google/protobuf/struct.proto +111 -0
  38. data/lib/protostar/compiler/include/google/protobuf/timestamp.proto +145 -0
  39. data/lib/protostar/compiler/include/google/protobuf/type.proto +217 -0
  40. data/lib/protostar/compiler/include/google/protobuf/wrappers.proto +157 -0
  41. data/lib/protostar/compiler/lexer.rb +659 -0
  42. data/lib/protostar/compiler/linker.rb +894 -0
  43. data/lib/protostar/compiler/option_interpreter.rb +363 -0
  44. data/lib/protostar/compiler/parser.rb +1696 -0
  45. data/lib/protostar/compiler/retention.rb +104 -0
  46. data/lib/protostar/compiler/run.rb +184 -0
  47. data/lib/protostar/compiler/source_info.rb +161 -0
  48. data/lib/protostar/compiler/symbol_table.rb +223 -0
  49. data/lib/protostar/compiler/text_format.rb +340 -0
  50. data/lib/protostar/compiler/validator.rb +944 -0
  51. data/lib/protostar/compiler.rb +304 -0
  52. data/lib/protostar/diagnostics/codes.rb +1307 -0
  53. data/lib/protostar/diagnostics/formats.rb +64 -0
  54. data/lib/protostar/diagnostics/renderer.rb +240 -0
  55. data/lib/protostar/diagnostics/source.rb +153 -0
  56. data/lib/protostar/diagnostics.rb +117 -0
  57. data/lib/protostar/dsl.rb +367 -0
  58. data/lib/protostar/enum.rb +70 -0
  59. data/lib/protostar/errors.rb +23 -0
  60. data/lib/protostar/google/protobuf/any_pb.rb +90 -0
  61. data/lib/protostar/google/protobuf/api_pb.rb +199 -0
  62. data/lib/protostar/google/protobuf/compiler/plugin_pb.rb +168 -0
  63. data/lib/protostar/google/protobuf/descriptor_pb.rb +1239 -0
  64. data/lib/protostar/google/protobuf/duration_pb.rb +99 -0
  65. data/lib/protostar/google/protobuf/empty_pb.rb +36 -0
  66. data/lib/protostar/google/protobuf/field_mask_pb.rb +228 -0
  67. data/lib/protostar/google/protobuf/source_context_pb.rb +33 -0
  68. data/lib/protostar/google/protobuf/struct_pb.rb +91 -0
  69. data/lib/protostar/google/protobuf/timestamp_pb.rb +129 -0
  70. data/lib/protostar/google/protobuf/type_pb.rb +202 -0
  71. data/lib/protostar/google/protobuf/wrappers_pb.rb +125 -0
  72. data/lib/protostar/google_protobuf_shim.rb +24 -0
  73. data/lib/protostar/json/encoder.rb +340 -0
  74. data/lib/protostar/json/errors.rb +34 -0
  75. data/lib/protostar/json/parser.rb +437 -0
  76. data/lib/protostar/json/path.rb +39 -0
  77. data/lib/protostar/json.rb +95 -0
  78. data/lib/protostar/lint/command.rb +197 -0
  79. data/lib/protostar/lint/config.rb +98 -0
  80. data/lib/protostar/lint/context.rb +126 -0
  81. data/lib/protostar/lint/directives.rb +56 -0
  82. data/lib/protostar/lint/fixer.rb +165 -0
  83. data/lib/protostar/lint/naming.rb +54 -0
  84. data/lib/protostar/lint/rule.rb +120 -0
  85. data/lib/protostar/lint/rules/comment_enum.rb +31 -0
  86. data/lib/protostar/lint/rules/comment_enum_value.rb +32 -0
  87. data/lib/protostar/lint/rules/comment_field.rb +33 -0
  88. data/lib/protostar/lint/rules/comment_message.rb +31 -0
  89. data/lib/protostar/lint/rules/comment_rpc.rb +31 -0
  90. data/lib/protostar/lint/rules/comment_service.rb +31 -0
  91. data/lib/protostar/lint/rules/edition_recommended.rb +31 -0
  92. data/lib/protostar/lint/rules/enum_first_value_zero.rb +34 -0
  93. data/lib/protostar/lint/rules/enum_pascal_case.rb +25 -0
  94. data/lib/protostar/lint/rules/enum_value_prefix.rb +38 -0
  95. data/lib/protostar/lint/rules/enum_value_upper_snake_case.rb +28 -0
  96. data/lib/protostar/lint/rules/enum_zero_value_suffix.rb +41 -0
  97. data/lib/protostar/lint/rules/field_lower_snake_case.rb +34 -0
  98. data/lib/protostar/lint/rules/field_not_required.rb +39 -0
  99. data/lib/protostar/lint/rules/field_number_reuse_risk.rb +45 -0
  100. data/lib/protostar/lint/rules/field_numbers_hot_range.rb +44 -0
  101. data/lib/protostar/lint/rules/file_lower_snake_case.rb +27 -0
  102. data/lib/protostar/lint/rules/import_no_public.rb +29 -0
  103. data/lib/protostar/lint/rules/import_no_weak.rb +28 -0
  104. data/lib/protostar/lint/rules/import_used.rb +33 -0
  105. data/lib/protostar/lint/rules/message_pascal_case.rb +27 -0
  106. data/lib/protostar/lint/rules/no_deprecated_features.rb +50 -0
  107. data/lib/protostar/lint/rules/no_groups.rb +34 -0
  108. data/lib/protostar/lint/rules/oneof_lower_snake_case.rb +27 -0
  109. data/lib/protostar/lint/rules/package_defined.rb +28 -0
  110. data/lib/protostar/lint/rules/package_directory_match.rb +33 -0
  111. data/lib/protostar/lint/rules/package_lower_snake_case.rb +28 -0
  112. data/lib/protostar/lint/rules/package_same_directory.rb +39 -0
  113. data/lib/protostar/lint/rules/package_version_suffix.rb +31 -0
  114. data/lib/protostar/lint/rules/reserved_names_with_numbers.rb +44 -0
  115. data/lib/protostar/lint/rules/rpc_pascal_case.rb +25 -0
  116. data/lib/protostar/lint/rules/rpc_request_response_unique.rb +40 -0
  117. data/lib/protostar/lint/rules/rpc_request_standard_name.rb +32 -0
  118. data/lib/protostar/lint/rules/rpc_response_standard_name.rb +31 -0
  119. data/lib/protostar/lint/rules/service_pascal_case.rb +25 -0
  120. data/lib/protostar/lint/rules/service_suffix.rb +28 -0
  121. data/lib/protostar/lint/rules/syntax_specified.rb +35 -0
  122. data/lib/protostar/lint/runner.rb +135 -0
  123. data/lib/protostar/lint.rb +122 -0
  124. data/lib/protostar/message/accessors.rb +86 -0
  125. data/lib/protostar/message/coercion.rb +171 -0
  126. data/lib/protostar/message/field_info.rb +145 -0
  127. data/lib/protostar/message/reflection.rb +149 -0
  128. data/lib/protostar/message.rb +572 -0
  129. data/lib/protostar/plugin.rb +94 -0
  130. data/lib/protostar/schema/default_value.rb +113 -0
  131. data/lib/protostar/schema/descriptor.rb +41 -0
  132. data/lib/protostar/schema/draft/copy.rb +88 -0
  133. data/lib/protostar/schema/draft/resolution.rb +177 -0
  134. data/lib/protostar/schema/draft.rb +779 -0
  135. data/lib/protostar/schema/enum.rb +106 -0
  136. data/lib/protostar/schema/extension_range.rb +37 -0
  137. data/lib/protostar/schema/features.rb +153 -0
  138. data/lib/protostar/schema/field.rb +201 -0
  139. data/lib/protostar/schema/file.rb +217 -0
  140. data/lib/protostar/schema/freezer.rb +61 -0
  141. data/lib/protostar/schema/message.rb +104 -0
  142. data/lib/protostar/schema/oneof.rb +38 -0
  143. data/lib/protostar/schema/options.rb +367 -0
  144. data/lib/protostar/schema/pool.rb +179 -0
  145. data/lib/protostar/schema/proto.rb +576 -0
  146. data/lib/protostar/schema/resolver.rb +118 -0
  147. data/lib/protostar/schema/service.rb +89 -0
  148. data/lib/protostar/schema/source_info.rb +53 -0
  149. data/lib/protostar/schema.rb +65 -0
  150. data/lib/protostar/short_names/any.rb +7 -0
  151. data/lib/protostar/short_names/duration.rb +7 -0
  152. data/lib/protostar/short_names/empty.rb +7 -0
  153. data/lib/protostar/short_names/field_mask.rb +7 -0
  154. data/lib/protostar/short_names/struct.rb +9 -0
  155. data/lib/protostar/short_names/timestamp.rb +7 -0
  156. data/lib/protostar/short_names/wrappers.rb +15 -0
  157. data/lib/protostar/text/extensions.rb +114 -0
  158. data/lib/protostar/text/parser.rb +439 -0
  159. data/lib/protostar/text/printer.rb +304 -0
  160. data/lib/protostar/text/tokenizer.rb +116 -0
  161. data/lib/protostar/text.rb +67 -0
  162. data/lib/protostar/types.rb +152 -0
  163. data/lib/protostar/unknown_field.rb +58 -0
  164. data/lib/protostar/version.rb +5 -0
  165. data/lib/protostar/view/generator.rb +298 -0
  166. data/lib/protostar/view/map.rb +194 -0
  167. data/lib/protostar/view/repeated.rb +143 -0
  168. data/lib/protostar/view/scan.rb +183 -0
  169. data/lib/protostar/view.rb +283 -0
  170. data/lib/protostar/well_known/any.rb +52 -0
  171. data/lib/protostar/well_known/duration.rb +53 -0
  172. data/lib/protostar/well_known/list_value.rb +63 -0
  173. data/lib/protostar/well_known/struct.rb +55 -0
  174. data/lib/protostar/well_known/timestamp.rb +64 -0
  175. data/lib/protostar/well_known/value.rb +60 -0
  176. data/lib/protostar/well_known.rb +38 -0
  177. data/lib/protostar/wire/io_source.rb +40 -0
  178. data/lib/protostar/wire/reader.rb +254 -0
  179. data/lib/protostar/wire/writer.rb +201 -0
  180. data/lib/protostar/wire.rb +96 -0
  181. data/lib/protostar.rb +95 -0
  182. data/shims/google-protobuf/lib/google/protobuf/any_pb.rb +17 -0
  183. data/shims/google-protobuf/lib/google/protobuf/api_pb.rb +22 -0
  184. data/shims/google-protobuf/lib/google/protobuf/compiler/plugin_pb.rb +25 -0
  185. data/shims/google-protobuf/lib/google/protobuf/descriptor_pb.rb +72 -0
  186. data/shims/google-protobuf/lib/google/protobuf/descriptor_pool.rb +164 -0
  187. data/shims/google-protobuf/lib/google/protobuf/descriptors.rb +553 -0
  188. data/shims/google-protobuf/lib/google/protobuf/duration_pb.rb +17 -0
  189. data/shims/google-protobuf/lib/google/protobuf/empty_pb.rb +17 -0
  190. data/shims/google-protobuf/lib/google/protobuf/field_mask_pb.rb +17 -0
  191. data/shims/google-protobuf/lib/google/protobuf/internal/convert.rb +180 -0
  192. data/shims/google-protobuf/lib/google/protobuf/internal/extensions.rb +154 -0
  193. data/shims/google-protobuf/lib/google/protobuf/internal/json.rb +104 -0
  194. data/shims/google-protobuf/lib/google/protobuf/internal/well_known.rb +140 -0
  195. data/shims/google-protobuf/lib/google/protobuf/map.rb +216 -0
  196. data/shims/google-protobuf/lib/google/protobuf/message.rb +544 -0
  197. data/shims/google-protobuf/lib/google/protobuf/message_exts.rb +41 -0
  198. data/shims/google-protobuf/lib/google/protobuf/plugin_pb.rb +4 -0
  199. data/shims/google-protobuf/lib/google/protobuf/repeated_field.rb +366 -0
  200. data/shims/google-protobuf/lib/google/protobuf/source_context_pb.rb +17 -0
  201. data/shims/google-protobuf/lib/google/protobuf/struct_pb.rb +20 -0
  202. data/shims/google-protobuf/lib/google/protobuf/timestamp_pb.rb +17 -0
  203. data/shims/google-protobuf/lib/google/protobuf/type_pb.rb +27 -0
  204. data/shims/google-protobuf/lib/google/protobuf/well_known_types.rb +37 -0
  205. data/shims/google-protobuf/lib/google/protobuf/wrappers_pb.rb +25 -0
  206. data/shims/google-protobuf/lib/google/protobuf.rb +107 -0
  207. data/shims/google-protobuf/lib/google/protobuf_ffi.rb +5 -0
  208. data/shims/google-protobuf/lib/google/protobuf_native.rb +5 -0
  209. data/sig/protostar/google/protobuf/any_pb.rbs +77 -0
  210. data/sig/protostar/google/protobuf/api_pb.rbs +242 -0
  211. data/sig/protostar/google/protobuf/compiler/plugin_pb.rbs +264 -0
  212. data/sig/protostar/google/protobuf/descriptor_pb.rbs +2220 -0
  213. data/sig/protostar/google/protobuf/duration_pb.rbs +82 -0
  214. data/sig/protostar/google/protobuf/empty_pb.rbs +18 -0
  215. data/sig/protostar/google/protobuf/field_mask_pb.rbs +170 -0
  216. data/sig/protostar/google/protobuf/source_context_pb.rbs +24 -0
  217. data/sig/protostar/google/protobuf/struct_pb.rbs +135 -0
  218. data/sig/protostar/google/protobuf/timestamp_pb.rbs +102 -0
  219. data/sig/protostar/google/protobuf/type_pb.rbs +304 -0
  220. data/sig/protostar/google/protobuf/wrappers_pb.rbs +169 -0
  221. data/sig/protostar/lint.rbs +216 -0
  222. data/sig/protostar.rbs +326 -0
  223. metadata +366 -0
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Protostar
4
+ module Schema
5
+ # An RPC service. Its methods are exposed as {#rpcs} and {#rpc} so that
6
+ # Object#methods and Object#method keep working on a descriptor.
7
+ class Service < Descriptor
8
+ # @return [File]
9
+ attr_reader :file
10
+
11
+ # @api private
12
+ def initialize(name:, full_name:, file:, index:)
13
+ @name = name
14
+ @full_name = full_name
15
+ @file = file
16
+ @index = index
17
+ @rpcs = Freezer::EMPTY_ARRAY
18
+ @rpcs_by_name = Freezer::EMPTY_HASH
19
+ end
20
+
21
+ # @api private
22
+ def __rpcs(rpcs)
23
+ @rpcs = rpcs
24
+ @rpcs_by_name = rpcs.to_h { |m| [m.name, m] }.freeze
25
+ self
26
+ end
27
+
28
+ # @return [Array<Method>] declaration order
29
+ attr_reader :rpcs
30
+
31
+ # @param name [String, Symbol]
32
+ # @return [Method, nil]
33
+ def rpc(name)
34
+ @rpcs_by_name[name.to_s]
35
+ end
36
+
37
+ # @return [Protostar::Google::Protobuf::ServiceDescriptorProto]
38
+ def to_proto
39
+ Proto::Writer.service(self)
40
+ end
41
+ end
42
+
43
+ # One RPC of a {Service}
44
+ class Method < Descriptor
45
+ # @return [Service]
46
+ attr_reader :service
47
+ # @return [Message]
48
+ attr_reader :input_type
49
+ # @return [Message]
50
+ attr_reader :output_type
51
+
52
+ # @api private
53
+ attr_reader :input_type_name, :output_type_name
54
+
55
+ # @api private
56
+ def initialize(name:, full_name:, service:, index:, input_type_name:, output_type_name:,
57
+ client_streaming:, server_streaming:)
58
+ @name = name
59
+ @full_name = full_name
60
+ @service = service
61
+ @index = index
62
+ @input_type_name = input_type_name
63
+ @output_type_name = output_type_name
64
+ @client_streaming = client_streaming
65
+ @server_streaming = server_streaming
66
+ end
67
+
68
+ # @return [File]
69
+ def file
70
+ @service.file
71
+ end
72
+
73
+ # @return [Boolean]
74
+ def client_streaming?
75
+ @client_streaming
76
+ end
77
+
78
+ # @return [Boolean]
79
+ def server_streaming?
80
+ @server_streaming
81
+ end
82
+
83
+ # @return [Protostar::Google::Protobuf::MethodDescriptorProto]
84
+ def to_proto
85
+ Proto::Writer.rpc(self)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Protostar
4
+ module Schema
5
+ # A file's `source_code_info`, kept verbatim
6
+ class SourceInfo
7
+ # One `SourceCodeInfo.Location`
8
+ class Location
9
+ # @return [Array<Integer>] the descriptor path, e.g. [4, 0, 2, 1] for message 0, field 1
10
+ attr_reader :path
11
+ # @return [Array<Integer>] [start_line, start_column, (end_line,) end_column], zero-based
12
+ attr_reader :span
13
+ # @return [String, nil]
14
+ attr_reader :leading_comments
15
+ # @return [String, nil]
16
+ attr_reader :trailing_comments
17
+ # @return [Array<String>]
18
+ attr_reader :leading_detached_comments
19
+
20
+ # @param path [Array<Integer>]
21
+ # @param span [Array<Integer>]
22
+ # @param leading_comments [String, nil]
23
+ # @param trailing_comments [String, nil]
24
+ # @param leading_detached_comments [Array<String>]
25
+ def initialize(path:, span:, leading_comments: nil, trailing_comments: nil, leading_detached_comments: [])
26
+ @path = Freezer.call(path)
27
+ @span = Freezer.call(span)
28
+ @leading_comments = Freezer.call(leading_comments)
29
+ @trailing_comments = Freezer.call(trailing_comments)
30
+ @leading_detached_comments = Freezer.call(leading_detached_comments)
31
+ freeze
32
+ end
33
+ end
34
+
35
+ # @return [Array<Location>]
36
+ attr_reader :locations
37
+
38
+ # @param locations [Array<Location>] in protoc's order
39
+ def initialize(locations)
40
+ @locations = locations.dup.freeze
41
+ @by_path = {}
42
+ @locations.each { |loc| @by_path[loc.path] ||= loc }
43
+ @by_path.freeze
44
+ end
45
+
46
+ # @param path [Array<Integer>]
47
+ # @return [Location, nil] the first location recorded for the path
48
+ def location(path)
49
+ @by_path[path]
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Protostar
4
+ # The descriptor model: an immutable, Ractor-shareable graph of files,
5
+ # messages, fields, enums and services. {File.draft} builds one;
6
+ # {File#to_proto} and {File.from_proto} translate to and from protoc's
7
+ # `FileDescriptorProto`.
8
+ module Schema
9
+ autoload :DefaultValue, ::File.expand_path("schema/default_value", __dir__)
10
+ autoload :Draft, ::File.expand_path("schema/draft", __dir__)
11
+ autoload :ExtensionRange, ::File.expand_path("schema/extension_range", __dir__)
12
+ autoload :Proto, ::File.expand_path("schema/proto", __dir__)
13
+ autoload :Resolver, ::File.expand_path("schema/resolver", __dir__)
14
+ autoload :SourceInfo, ::File.expand_path("schema/source_info", __dir__)
15
+
16
+ # Raised for malformed descriptors, missing dependencies and pool clashes
17
+ class Error < Protostar::Error; end
18
+
19
+ # The JSON name protoc derives from a field name: underscores dropped,
20
+ # the letter after each one upper-cased
21
+ # @param name [String]
22
+ # @return [String]
23
+ def self.json_name(name)
24
+ out = +""
25
+ upper = false
26
+ name.each_char do |c|
27
+ if c == "_"
28
+ upper = true
29
+ elsif upper
30
+ out << c.upcase(:ascii)
31
+ upper = false
32
+ else
33
+ out << c
34
+ end
35
+ end
36
+ out
37
+ end
38
+
39
+ # Raised when a type name, extendee or method type cannot be resolved
40
+ class ResolveError < Error
41
+ # @return [String, nil] the name as written
42
+ attr_reader :name
43
+ # @return [String, nil] the scope the lookup started from
44
+ attr_reader :scope
45
+
46
+ def initialize(message, name: nil, scope: nil)
47
+ @name = name
48
+ @scope = scope
49
+ super(message)
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ require_relative "schema/freezer"
56
+ require_relative "schema/options"
57
+ require_relative "schema/features"
58
+ require_relative "schema/descriptor"
59
+ require_relative "schema/file"
60
+ require_relative "schema/message"
61
+ require_relative "schema/oneof"
62
+ require_relative "schema/field"
63
+ require_relative "schema/enum"
64
+ require_relative "schema/service"
65
+ require_relative "schema/pool"
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../google/protobuf/any_pb"
4
+
5
+ module Protostar
6
+ Any = Google::Protobuf::Any
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../google/protobuf/duration_pb"
4
+
5
+ module Protostar
6
+ Duration = Google::Protobuf::Duration
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../google/protobuf/empty_pb"
4
+
5
+ module Protostar
6
+ Empty = Google::Protobuf::Empty
7
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../google/protobuf/field_mask_pb"
4
+
5
+ module Protostar
6
+ FieldMask = Google::Protobuf::FieldMask
7
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../google/protobuf/struct_pb"
4
+
5
+ module Protostar
6
+ Struct = Google::Protobuf::Struct
7
+ Value = Google::Protobuf::Value
8
+ ListValue = Google::Protobuf::ListValue
9
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../google/protobuf/timestamp_pb"
4
+
5
+ module Protostar
6
+ Timestamp = Google::Protobuf::Timestamp
7
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../google/protobuf/wrappers_pb"
4
+
5
+ module Protostar
6
+ DoubleValue = Google::Protobuf::DoubleValue
7
+ FloatValue = Google::Protobuf::FloatValue
8
+ Int64Value = Google::Protobuf::Int64Value
9
+ UInt64Value = Google::Protobuf::UInt64Value
10
+ Int32Value = Google::Protobuf::Int32Value
11
+ UInt32Value = Google::Protobuf::UInt32Value
12
+ BoolValue = Google::Protobuf::BoolValue
13
+ StringValue = Google::Protobuf::StringValue
14
+ BytesValue = Google::Protobuf::BytesValue
15
+ end
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Protostar
4
+ module Text
5
+ # Extensions seen through the unknown fields that hold them: finding the
6
+ # extensions of a message, reading their values out of unknown fields
7
+ # and writing values back into unknown fields.
8
+ # @api private
9
+ class Extensions
10
+ F = Message::FieldInfo
11
+
12
+ # @param registry [Types::Registry]
13
+ # @param pool [Schema::Pool, nil]
14
+ def initialize(registry, pool)
15
+ @registry = registry
16
+ @pool = pool
17
+ @by_extendee = {}
18
+ @infos = {}
19
+ end
20
+
21
+ # @param descriptor [Schema::Message]
22
+ # @return [Hash{Integer => Schema::Field}] extensions of the message by number
23
+ def of(descriptor)
24
+ @by_extendee[descriptor] ||= begin
25
+ fields = if @pool
26
+ @pool.extensions_of(descriptor.full_name)
27
+ else
28
+ files(descriptor.file).flat_map(&:all_extensions).select { |e| e.extendee.equal?(descriptor) }
29
+ end
30
+ fields.to_h { |f| [f.number, f] }
31
+ end
32
+ end
33
+
34
+ # @param descriptor [Schema::Message]
35
+ # @param name [String] the extension's full name
36
+ # @return [Schema::Field, nil]
37
+ def named(descriptor, name)
38
+ of(descriptor).each_value.find { |f| f.full_name == name }
39
+ end
40
+
41
+ # @param field [Schema::Field] an extension
42
+ # @return [Message::FieldInfo, nil] nil when its message or enum type has no class
43
+ def info(field)
44
+ return @infos[field] if @infos.key?(field)
45
+ @infos[field] = begin
46
+ Message::FieldInfo.new(field, nil, method(:resolve))
47
+ rescue KeyError
48
+ nil
49
+ end
50
+ end
51
+
52
+ # The values an extension holds in a message's unknown fields
53
+ # @param info [Message::FieldInfo]
54
+ # @param unknown [Array<UnknownField>] those with the extension's number
55
+ # @return [Array] values as the field's reader would give them, or nil
56
+ # when the bytes do not read as the extension's type
57
+ def read(info, unknown)
58
+ values = []
59
+ unknown.each do |u|
60
+ if u.wire_type == Wire::LENGTH_DELIMITED && info.packable && !info.message? && info.kind != F::STRING && info.kind != F::BYTES
61
+ r = Wire::Reader.new(u.value)
62
+ values << scalar(info, r) until r.eof?
63
+ elsif u.wire_type != info.wire_type
64
+ return nil
65
+ elsif info.message?
66
+ values << info.message_class.decode(u.value)
67
+ else
68
+ values << scalar(info, Wire::Reader.new(u.bytes))
69
+ end
70
+ end
71
+ values
72
+ rescue DecodeError
73
+ nil
74
+ end
75
+
76
+ # @param info [Message::FieldInfo]
77
+ # @param values [Array]
78
+ # @return [Array<UnknownField>] the fields the binary codec would have kept
79
+ def write(info, values)
80
+ if info.packed && !values.empty?
81
+ w = Wire::Writer.new
82
+ Codec::Encoder.packed(info, values, w)
83
+ payload = w.string
84
+ return [UnknownField.new(info.number, Wire::LENGTH_DELIMITED, Wire.varint(payload.bytesize) + payload)]
85
+ end
86
+ values.map do |v|
87
+ w = Wire::Writer.new
88
+ sizes = {}.compare_by_identity
89
+ Codec::Sizer.value(info, v, sizes)
90
+ Codec::Encoder.value(info, v, w, sizes)
91
+ UnknownField.new(info.number, info.wire_type, w.string)
92
+ end
93
+ end
94
+
95
+ private
96
+
97
+ def scalar(info, r)
98
+ v = Codec::Decoder.scalar(r, info)
99
+ (info.kind == F::ENUM) ? (info.enum_names[v] || v) : v
100
+ end
101
+
102
+ def resolve(descriptor)
103
+ Types.find(descriptor.full_name, registry: @registry || Types.registry) || raise(KeyError, descriptor.full_name)
104
+ end
105
+
106
+ # The file and everything it imports, transitively
107
+ def files(file, seen = {})
108
+ return [] if seen[file]
109
+ seen[file] = true
110
+ [file] + file.dependency_files.flat_map { |d| files(d, seen) }
111
+ end
112
+ end
113
+ end
114
+ end