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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +60 -0
- data/LICENSE.txt +21 -0
- data/README.md +647 -0
- data/THIRD_PARTY_NOTICES.md +61 -0
- data/exe/protoc-gen-protostar +7 -0
- data/exe/protostar +7 -0
- data/lib/protostar/builder/generator.rb +71 -0
- data/lib/protostar/builder/sink.rb +35 -0
- data/lib/protostar/builder.rb +965 -0
- data/lib/protostar/cli.rb +267 -0
- data/lib/protostar/codec/decode_generator.rb +199 -0
- data/lib/protostar/codec/decoder.rb +296 -0
- data/lib/protostar/codec/encode_generator.rb +224 -0
- data/lib/protostar/codec/encoder.rb +121 -0
- data/lib/protostar/codec/sizer.rb +91 -0
- data/lib/protostar/codec.rb +15 -0
- data/lib/protostar/compiler/ast.rb +193 -0
- data/lib/protostar/compiler/emitters/descriptor_set.rb +57 -0
- data/lib/protostar/compiler/emitters/google_ruby.rb +103 -0
- data/lib/protostar/compiler/emitters/grpc.rb +175 -0
- data/lib/protostar/compiler/emitters/protostar_rbs.rb +252 -0
- data/lib/protostar/compiler/emitters/rbs.rb +394 -0
- data/lib/protostar/compiler/emitters/ruby.rb +503 -0
- data/lib/protostar/compiler/emitters.rb +268 -0
- data/lib/protostar/compiler/include/LICENSE +32 -0
- data/lib/protostar/compiler/include/google/protobuf/any.proto +106 -0
- data/lib/protostar/compiler/include/google/protobuf/api.proto +229 -0
- data/lib/protostar/compiler/include/google/protobuf/compiler/plugin.proto +180 -0
- data/lib/protostar/compiler/include/google/protobuf/cpp_features.proto +87 -0
- data/lib/protostar/compiler/include/google/protobuf/descriptor.proto +1532 -0
- data/lib/protostar/compiler/include/google/protobuf/duration.proto +115 -0
- data/lib/protostar/compiler/include/google/protobuf/empty.proto +51 -0
- data/lib/protostar/compiler/include/google/protobuf/field_mask.proto +243 -0
- data/lib/protostar/compiler/include/google/protobuf/java_features.proto +132 -0
- data/lib/protostar/compiler/include/google/protobuf/source_context.proto +48 -0
- data/lib/protostar/compiler/include/google/protobuf/struct.proto +111 -0
- data/lib/protostar/compiler/include/google/protobuf/timestamp.proto +145 -0
- data/lib/protostar/compiler/include/google/protobuf/type.proto +217 -0
- data/lib/protostar/compiler/include/google/protobuf/wrappers.proto +157 -0
- data/lib/protostar/compiler/lexer.rb +659 -0
- data/lib/protostar/compiler/linker.rb +894 -0
- data/lib/protostar/compiler/option_interpreter.rb +363 -0
- data/lib/protostar/compiler/parser.rb +1696 -0
- data/lib/protostar/compiler/retention.rb +104 -0
- data/lib/protostar/compiler/run.rb +184 -0
- data/lib/protostar/compiler/source_info.rb +161 -0
- data/lib/protostar/compiler/symbol_table.rb +223 -0
- data/lib/protostar/compiler/text_format.rb +340 -0
- data/lib/protostar/compiler/validator.rb +944 -0
- data/lib/protostar/compiler.rb +304 -0
- data/lib/protostar/diagnostics/codes.rb +1307 -0
- data/lib/protostar/diagnostics/formats.rb +64 -0
- data/lib/protostar/diagnostics/renderer.rb +240 -0
- data/lib/protostar/diagnostics/source.rb +153 -0
- data/lib/protostar/diagnostics.rb +117 -0
- data/lib/protostar/dsl.rb +367 -0
- data/lib/protostar/enum.rb +70 -0
- data/lib/protostar/errors.rb +23 -0
- data/lib/protostar/google/protobuf/any_pb.rb +90 -0
- data/lib/protostar/google/protobuf/api_pb.rb +199 -0
- data/lib/protostar/google/protobuf/compiler/plugin_pb.rb +168 -0
- data/lib/protostar/google/protobuf/descriptor_pb.rb +1239 -0
- data/lib/protostar/google/protobuf/duration_pb.rb +99 -0
- data/lib/protostar/google/protobuf/empty_pb.rb +36 -0
- data/lib/protostar/google/protobuf/field_mask_pb.rb +228 -0
- data/lib/protostar/google/protobuf/source_context_pb.rb +33 -0
- data/lib/protostar/google/protobuf/struct_pb.rb +91 -0
- data/lib/protostar/google/protobuf/timestamp_pb.rb +129 -0
- data/lib/protostar/google/protobuf/type_pb.rb +202 -0
- data/lib/protostar/google/protobuf/wrappers_pb.rb +125 -0
- data/lib/protostar/google_protobuf_shim.rb +24 -0
- data/lib/protostar/json/encoder.rb +340 -0
- data/lib/protostar/json/errors.rb +34 -0
- data/lib/protostar/json/parser.rb +437 -0
- data/lib/protostar/json/path.rb +39 -0
- data/lib/protostar/json.rb +95 -0
- data/lib/protostar/lint/command.rb +197 -0
- data/lib/protostar/lint/config.rb +98 -0
- data/lib/protostar/lint/context.rb +126 -0
- data/lib/protostar/lint/directives.rb +56 -0
- data/lib/protostar/lint/fixer.rb +165 -0
- data/lib/protostar/lint/naming.rb +54 -0
- data/lib/protostar/lint/rule.rb +120 -0
- data/lib/protostar/lint/rules/comment_enum.rb +31 -0
- data/lib/protostar/lint/rules/comment_enum_value.rb +32 -0
- data/lib/protostar/lint/rules/comment_field.rb +33 -0
- data/lib/protostar/lint/rules/comment_message.rb +31 -0
- data/lib/protostar/lint/rules/comment_rpc.rb +31 -0
- data/lib/protostar/lint/rules/comment_service.rb +31 -0
- data/lib/protostar/lint/rules/edition_recommended.rb +31 -0
- data/lib/protostar/lint/rules/enum_first_value_zero.rb +34 -0
- data/lib/protostar/lint/rules/enum_pascal_case.rb +25 -0
- data/lib/protostar/lint/rules/enum_value_prefix.rb +38 -0
- data/lib/protostar/lint/rules/enum_value_upper_snake_case.rb +28 -0
- data/lib/protostar/lint/rules/enum_zero_value_suffix.rb +41 -0
- data/lib/protostar/lint/rules/field_lower_snake_case.rb +34 -0
- data/lib/protostar/lint/rules/field_not_required.rb +39 -0
- data/lib/protostar/lint/rules/field_number_reuse_risk.rb +45 -0
- data/lib/protostar/lint/rules/field_numbers_hot_range.rb +44 -0
- data/lib/protostar/lint/rules/file_lower_snake_case.rb +27 -0
- data/lib/protostar/lint/rules/import_no_public.rb +29 -0
- data/lib/protostar/lint/rules/import_no_weak.rb +28 -0
- data/lib/protostar/lint/rules/import_used.rb +33 -0
- data/lib/protostar/lint/rules/message_pascal_case.rb +27 -0
- data/lib/protostar/lint/rules/no_deprecated_features.rb +50 -0
- data/lib/protostar/lint/rules/no_groups.rb +34 -0
- data/lib/protostar/lint/rules/oneof_lower_snake_case.rb +27 -0
- data/lib/protostar/lint/rules/package_defined.rb +28 -0
- data/lib/protostar/lint/rules/package_directory_match.rb +33 -0
- data/lib/protostar/lint/rules/package_lower_snake_case.rb +28 -0
- data/lib/protostar/lint/rules/package_same_directory.rb +39 -0
- data/lib/protostar/lint/rules/package_version_suffix.rb +31 -0
- data/lib/protostar/lint/rules/reserved_names_with_numbers.rb +44 -0
- data/lib/protostar/lint/rules/rpc_pascal_case.rb +25 -0
- data/lib/protostar/lint/rules/rpc_request_response_unique.rb +40 -0
- data/lib/protostar/lint/rules/rpc_request_standard_name.rb +32 -0
- data/lib/protostar/lint/rules/rpc_response_standard_name.rb +31 -0
- data/lib/protostar/lint/rules/service_pascal_case.rb +25 -0
- data/lib/protostar/lint/rules/service_suffix.rb +28 -0
- data/lib/protostar/lint/rules/syntax_specified.rb +35 -0
- data/lib/protostar/lint/runner.rb +135 -0
- data/lib/protostar/lint.rb +122 -0
- data/lib/protostar/message/accessors.rb +86 -0
- data/lib/protostar/message/coercion.rb +171 -0
- data/lib/protostar/message/field_info.rb +145 -0
- data/lib/protostar/message/reflection.rb +149 -0
- data/lib/protostar/message.rb +572 -0
- data/lib/protostar/plugin.rb +94 -0
- data/lib/protostar/schema/default_value.rb +113 -0
- data/lib/protostar/schema/descriptor.rb +41 -0
- data/lib/protostar/schema/draft/copy.rb +88 -0
- data/lib/protostar/schema/draft/resolution.rb +177 -0
- data/lib/protostar/schema/draft.rb +779 -0
- data/lib/protostar/schema/enum.rb +106 -0
- data/lib/protostar/schema/extension_range.rb +37 -0
- data/lib/protostar/schema/features.rb +153 -0
- data/lib/protostar/schema/field.rb +201 -0
- data/lib/protostar/schema/file.rb +217 -0
- data/lib/protostar/schema/freezer.rb +61 -0
- data/lib/protostar/schema/message.rb +104 -0
- data/lib/protostar/schema/oneof.rb +38 -0
- data/lib/protostar/schema/options.rb +367 -0
- data/lib/protostar/schema/pool.rb +179 -0
- data/lib/protostar/schema/proto.rb +576 -0
- data/lib/protostar/schema/resolver.rb +118 -0
- data/lib/protostar/schema/service.rb +89 -0
- data/lib/protostar/schema/source_info.rb +53 -0
- data/lib/protostar/schema.rb +65 -0
- data/lib/protostar/short_names/any.rb +7 -0
- data/lib/protostar/short_names/duration.rb +7 -0
- data/lib/protostar/short_names/empty.rb +7 -0
- data/lib/protostar/short_names/field_mask.rb +7 -0
- data/lib/protostar/short_names/struct.rb +9 -0
- data/lib/protostar/short_names/timestamp.rb +7 -0
- data/lib/protostar/short_names/wrappers.rb +15 -0
- data/lib/protostar/text/extensions.rb +114 -0
- data/lib/protostar/text/parser.rb +439 -0
- data/lib/protostar/text/printer.rb +304 -0
- data/lib/protostar/text/tokenizer.rb +116 -0
- data/lib/protostar/text.rb +67 -0
- data/lib/protostar/types.rb +152 -0
- data/lib/protostar/unknown_field.rb +58 -0
- data/lib/protostar/version.rb +5 -0
- data/lib/protostar/view/generator.rb +298 -0
- data/lib/protostar/view/map.rb +194 -0
- data/lib/protostar/view/repeated.rb +143 -0
- data/lib/protostar/view/scan.rb +183 -0
- data/lib/protostar/view.rb +283 -0
- data/lib/protostar/well_known/any.rb +52 -0
- data/lib/protostar/well_known/duration.rb +53 -0
- data/lib/protostar/well_known/list_value.rb +63 -0
- data/lib/protostar/well_known/struct.rb +55 -0
- data/lib/protostar/well_known/timestamp.rb +64 -0
- data/lib/protostar/well_known/value.rb +60 -0
- data/lib/protostar/well_known.rb +38 -0
- data/lib/protostar/wire/io_source.rb +40 -0
- data/lib/protostar/wire/reader.rb +254 -0
- data/lib/protostar/wire/writer.rb +201 -0
- data/lib/protostar/wire.rb +96 -0
- data/lib/protostar.rb +95 -0
- data/shims/google-protobuf/lib/google/protobuf/any_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/api_pb.rb +22 -0
- data/shims/google-protobuf/lib/google/protobuf/compiler/plugin_pb.rb +25 -0
- data/shims/google-protobuf/lib/google/protobuf/descriptor_pb.rb +72 -0
- data/shims/google-protobuf/lib/google/protobuf/descriptor_pool.rb +164 -0
- data/shims/google-protobuf/lib/google/protobuf/descriptors.rb +553 -0
- data/shims/google-protobuf/lib/google/protobuf/duration_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/empty_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/field_mask_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/internal/convert.rb +180 -0
- data/shims/google-protobuf/lib/google/protobuf/internal/extensions.rb +154 -0
- data/shims/google-protobuf/lib/google/protobuf/internal/json.rb +104 -0
- data/shims/google-protobuf/lib/google/protobuf/internal/well_known.rb +140 -0
- data/shims/google-protobuf/lib/google/protobuf/map.rb +216 -0
- data/shims/google-protobuf/lib/google/protobuf/message.rb +544 -0
- data/shims/google-protobuf/lib/google/protobuf/message_exts.rb +41 -0
- data/shims/google-protobuf/lib/google/protobuf/plugin_pb.rb +4 -0
- data/shims/google-protobuf/lib/google/protobuf/repeated_field.rb +366 -0
- data/shims/google-protobuf/lib/google/protobuf/source_context_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/struct_pb.rb +20 -0
- data/shims/google-protobuf/lib/google/protobuf/timestamp_pb.rb +17 -0
- data/shims/google-protobuf/lib/google/protobuf/type_pb.rb +27 -0
- data/shims/google-protobuf/lib/google/protobuf/well_known_types.rb +37 -0
- data/shims/google-protobuf/lib/google/protobuf/wrappers_pb.rb +25 -0
- data/shims/google-protobuf/lib/google/protobuf.rb +107 -0
- data/shims/google-protobuf/lib/google/protobuf_ffi.rb +5 -0
- data/shims/google-protobuf/lib/google/protobuf_native.rb +5 -0
- data/sig/protostar/google/protobuf/any_pb.rbs +77 -0
- data/sig/protostar/google/protobuf/api_pb.rbs +242 -0
- data/sig/protostar/google/protobuf/compiler/plugin_pb.rbs +264 -0
- data/sig/protostar/google/protobuf/descriptor_pb.rbs +2220 -0
- data/sig/protostar/google/protobuf/duration_pb.rbs +82 -0
- data/sig/protostar/google/protobuf/empty_pb.rbs +18 -0
- data/sig/protostar/google/protobuf/field_mask_pb.rbs +170 -0
- data/sig/protostar/google/protobuf/source_context_pb.rbs +24 -0
- data/sig/protostar/google/protobuf/struct_pb.rbs +135 -0
- data/sig/protostar/google/protobuf/timestamp_pb.rbs +102 -0
- data/sig/protostar/google/protobuf/type_pb.rbs +304 -0
- data/sig/protostar/google/protobuf/wrappers_pb.rbs +169 -0
- data/sig/protostar/lint.rbs +216 -0
- data/sig/protostar.rbs +326 -0
- metadata +366 -0
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Google
|
|
4
|
+
module Protobuf
|
|
5
|
+
# A Hash-like map with keys and values of fixed types, checked on every
|
|
6
|
+
# write. A message's map field reads as a Map over the message's own
|
|
7
|
+
# storage, so writes to it are writes to the message.
|
|
8
|
+
class Map
|
|
9
|
+
include Enumerable
|
|
10
|
+
|
|
11
|
+
KEY_TYPES = %i[int32 int64 uint32 uint64 sint32 sint64 fixed32 fixed64 sfixed32 sfixed64 bool string bytes]
|
|
12
|
+
.to_h { |t| [t, true] }.freeze
|
|
13
|
+
private_constant :KEY_TYPES
|
|
14
|
+
|
|
15
|
+
# @overload new(key_type, value_type, init_hashmap = {})
|
|
16
|
+
# @overload new(key_type, value_type, value_typeclass, init_hashmap = {})
|
|
17
|
+
# @param value_typeclass [Class, Module] for :message and :enum values
|
|
18
|
+
# @param key_type [Symbol]
|
|
19
|
+
# @param value_type [Symbol]
|
|
20
|
+
def self.new(*args)
|
|
21
|
+
raise ArgumentError, "Map constructor expects 2, 3 or 4 arguments." if args.size < 2 || args.size > 4
|
|
22
|
+
key_type, value_type, *rest = args
|
|
23
|
+
raise ArgumentError, "Expected symbol for field type." unless key_type.is_a?(Symbol)
|
|
24
|
+
raise ArgumentError, "Unknown field type." unless Internal::CONTAINER_TYPES.key?(key_type)
|
|
25
|
+
sub, initial = Internal.type_class(value_type, rest, 1)
|
|
26
|
+
raise ArgumentError, "Invalid key type for map." unless KEY_TYPES.key?(key_type)
|
|
27
|
+
instance = allocate
|
|
28
|
+
instance.__setup(key_type, value_type, sub, {}, "")
|
|
29
|
+
instance.__merge_into_self(initial) unless initial.nil?
|
|
30
|
+
instance
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @api private
|
|
34
|
+
def self.__for_field(fd, hash)
|
|
35
|
+
entry = fd.subtype
|
|
36
|
+
key = entry.lookup("key")
|
|
37
|
+
value = entry.lookup("value")
|
|
38
|
+
instance = allocate
|
|
39
|
+
instance.__setup(key.type, value.type, value.subtype, hash, "")
|
|
40
|
+
instance
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @api private
|
|
44
|
+
def __setup(key_type, value_type, sub, hash, name)
|
|
45
|
+
@key_type = key_type
|
|
46
|
+
@value_type = value_type
|
|
47
|
+
@sub = sub
|
|
48
|
+
@hash = hash
|
|
49
|
+
@name = name
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# @api private
|
|
53
|
+
def __hash
|
|
54
|
+
@hash
|
|
55
|
+
end
|
|
56
|
+
alias_method :__storage, :__hash
|
|
57
|
+
|
|
58
|
+
# @api private
|
|
59
|
+
def __types
|
|
60
|
+
[FieldDescriptor::CTYPES.fetch(@key_type), FieldDescriptor::CTYPES.fetch(@value_type), @sub]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# @api private
|
|
64
|
+
# @raise [TypeError] unless this map can be the field's value
|
|
65
|
+
def __check_field(fd)
|
|
66
|
+
entry = fd.subtype
|
|
67
|
+
key = entry.lookup("key")
|
|
68
|
+
value = entry.lookup("value")
|
|
69
|
+
raise TypeError, "Map key type does not match field's key type" unless FieldDescriptor::CTYPES.fetch(@key_type) == key.__ctype
|
|
70
|
+
raise TypeError, "Map value type does not match field's value type" unless FieldDescriptor::CTYPES.fetch(@value_type) == value.__ctype
|
|
71
|
+
raise TypeError, "Map value type has wrong message/enum class" unless @sub.equal?(value.subtype)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# @return [Object, nil] the value, nil when the key is not there
|
|
75
|
+
def [](key)
|
|
76
|
+
@hash[convert_key(key)]
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# @return [Object] the value given
|
|
80
|
+
def []=(key, value)
|
|
81
|
+
check_frozen
|
|
82
|
+
k = convert_key(key)
|
|
83
|
+
@hash[k] = convert_value(value)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def has_key?(key)
|
|
87
|
+
@hash.key?(convert_key(key))
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# @return [Object, nil] the value removed
|
|
91
|
+
def delete(key)
|
|
92
|
+
check_frozen
|
|
93
|
+
@hash.delete(convert_key(key))
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# @return [nil]
|
|
97
|
+
def clear
|
|
98
|
+
check_frozen
|
|
99
|
+
@hash.clear
|
|
100
|
+
nil
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def length
|
|
104
|
+
@hash.length
|
|
105
|
+
end
|
|
106
|
+
alias_method :size, :length
|
|
107
|
+
|
|
108
|
+
def keys
|
|
109
|
+
@hash.keys
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def values
|
|
113
|
+
@hash.values
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Yields each key and value
|
|
117
|
+
# @return [nil]
|
|
118
|
+
def each(&block)
|
|
119
|
+
return enum_for(:each) { size } unless block
|
|
120
|
+
@hash.each(&block)
|
|
121
|
+
nil
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# @return [Hash] with message values as Hashes
|
|
125
|
+
def to_h
|
|
126
|
+
return @hash.dup unless @value_type == :message || @value_type == :group
|
|
127
|
+
@hash.transform_values(&:to_h)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def inspect
|
|
131
|
+
"{#{@hash.map { |k, v| "#{k.inspect}=>#{v.inspect}" }.join(", ")}}"
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Equal to a Map of the same types and entries, or a Hash with those entries
|
|
135
|
+
def ==(other)
|
|
136
|
+
return true if equal?(other)
|
|
137
|
+
if other.is_a?(Hash)
|
|
138
|
+
hash = other
|
|
139
|
+
other = Map.allocate
|
|
140
|
+
other.__setup(@key_type, @value_type, @sub, {}, @name)
|
|
141
|
+
other.__merge_into_self(hash)
|
|
142
|
+
end
|
|
143
|
+
return false unless other.is_a?(Map)
|
|
144
|
+
__types == other.__types && @hash == other.__hash
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Independent of entry order, like equality
|
|
148
|
+
def hash
|
|
149
|
+
@hash.to_a.sort_by(&:hash).hash
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# @return [Map] a copy; message values are shared
|
|
153
|
+
def dup
|
|
154
|
+
copy = Map.allocate
|
|
155
|
+
copy.__setup(@key_type, @value_type, @sub, @hash.dup, @name)
|
|
156
|
+
copy
|
|
157
|
+
end
|
|
158
|
+
alias_method :clone, :dup
|
|
159
|
+
|
|
160
|
+
# @api private
|
|
161
|
+
def __deep_copy
|
|
162
|
+
copy = Map.allocate
|
|
163
|
+
copy.__setup(@key_type, @value_type, @sub, @hash.transform_values { |v| Internal.deep_copy_value(v) }, @name)
|
|
164
|
+
copy
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# @param other [Map, Hash]
|
|
168
|
+
# @return [Map] a copy of this map with the other's entries written over it
|
|
169
|
+
def merge(other)
|
|
170
|
+
dup.__merge_into_self(other)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# @api private
|
|
174
|
+
def __merge_into_self(other)
|
|
175
|
+
case other
|
|
176
|
+
when Hash
|
|
177
|
+
other.each { |k, v| @hash[convert_key(k)] = convert_value(v) }
|
|
178
|
+
when Map
|
|
179
|
+
raise ArgumentError, "Attempt to merge Map with mismatching types" unless __types == other.__types
|
|
180
|
+
@hash.merge!(other.__hash)
|
|
181
|
+
else
|
|
182
|
+
raise ArgumentError, "Unknown type merging into Map"
|
|
183
|
+
end
|
|
184
|
+
self
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def frozen?
|
|
188
|
+
super || @hash.frozen?
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Freezes the map, its storage and the messages in it
|
|
192
|
+
def freeze
|
|
193
|
+
return self if Object.instance_method(:frozen?).bind_call(self)
|
|
194
|
+
unless @hash.frozen?
|
|
195
|
+
@hash.each_value { |v| v.freeze if v.is_a?(Protostar::Message) }
|
|
196
|
+
@hash.freeze
|
|
197
|
+
end
|
|
198
|
+
super
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
private
|
|
202
|
+
|
|
203
|
+
def convert_key(key)
|
|
204
|
+
Internal::Convert.to_store(key, @key_type, nil, @name)
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def convert_value(value)
|
|
208
|
+
Internal::Convert.to_store(value, @value_type, @sub, @name)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def check_frozen
|
|
212
|
+
raise FrozenError.new("can't modify frozen #{self.class}: #{inspect}", receiver: self) if frozen?
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
end
|