grpc_serializer 1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/grpc_serializer.rb +150 -0
  3. metadata +128 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 449ccaf765fa3105d22137b7fe277cd7988b10420f34b15206c01a6b8d30e954
4
+ data.tar.gz: 1b5b8fa22533b90d10f3a950ad7420226d12e2a431611d1215318c6d9785dfd9
5
+ SHA512:
6
+ metadata.gz: 9a74d3620f2f96fbe818e0e6f74c468a0db58072b1e3a37e9c5b9f0c7ca894c909afa9678f465d640b35f0cd01c56dfc00a92604451e266b3bde4642d4fa7518
7
+ data.tar.gz: 29cf6ea058d4df5fc751b9c0b73b0860bca86eaa8dbd75a67c47e7ae13ade3cce196bcdfd04842b0402ffd160941577057fb6673a450aecb80bf1afdc4298fb0
@@ -0,0 +1,150 @@
1
+ class GrpcSerializer
2
+
3
+ CUSTOM_ENCODED_TYPES = {}.freeze
4
+ REPEATED_ENCODED_TYPES = {}.freeze
5
+
6
+ def self.hash_to_grpc_object(source_hash, message_class)
7
+ final_hash = source_hash.dup
8
+ serialize_with_descriptor(message_class.descriptor, final_hash )
9
+ end
10
+
11
+ def self.grpc_object_to_hash(source_hash, message_class)
12
+ final_hash = source_hash.dup
13
+ value, _ = deserialize_with_descriptor(message_class.descriptor, final_hash)
14
+ value
15
+ end
16
+
17
+ private
18
+
19
+ def self.serialize_with_descriptor(descriptor_class, hash_value, render_as_hash: false)
20
+ new_hash = {}
21
+ return hash_value if descriptor_class.nil?
22
+ available_keys = hash_value.keys
23
+ descriptor_class.entries.each do |entry|
24
+ is_key_present = available_keys.include?(entry.name.to_sym)
25
+ value = serialize_with_field_descriptor(entry, hash_value[entry.name.to_sym], is_key_present: is_key_present)
26
+ unless value.nil?
27
+ new_hash[entry.name] = value
28
+ end
29
+ end
30
+
31
+ render_as_hash ? new_hash : descriptor_class.msgclass.new(new_hash)
32
+ end
33
+
34
+ def self.serialize_with_field_descriptor(field_descriptor, value, is_key_present: true)
35
+ return value if field_descriptor.nil?
36
+
37
+ if field_descriptor.label == :repeated
38
+ return serialize_with_repeated_field(field_descriptor, value)
39
+ end
40
+ if field_descriptor.type == :message
41
+ custom_encode = CUSTOM_ENCODED_TYPES[field_descriptor.subtype.msgclass]
42
+ if custom_encode
43
+ return field_descriptor.subtype.msgclass.encode_value(value, is_key_present)
44
+ end
45
+ if field_descriptor.subtype.is_a?(Google::Protobuf::Descriptor)
46
+ return serialize_with_descriptor(field_descriptor.subtype, value) unless value.nil?
47
+ end
48
+
49
+ return field_descriptor.subtype.msgclass.new(value) unless value.nil?
50
+
51
+ end
52
+ value
53
+ end
54
+
55
+ def self.serialize_with_repeated_field(field_descriptor, value)
56
+ if field_descriptor.label == :repeated
57
+ if field_descriptor.subtype && field_descriptor.subtype.lookup("key")
58
+ if field_descriptor.subtype.lookup("value")
59
+ value_dup = ({})
60
+ org_value = value || {}
61
+ org_value.keys.each do |k|
62
+ value_dup[k.to_s] = (serialize_with_field_descriptor(field_descriptor.subtype.lookup("value"), org_value[k]))
63
+ end
64
+ return value_dup
65
+ else
66
+ return value
67
+ end
68
+ end
69
+ return (value || []).map { |v| serialize_with_descriptor(field_descriptor.subtype, v) }
70
+ end
71
+ end
72
+
73
+ def self.deserialize_with_descriptor(descriptor_class, rpc_value)
74
+ new_hash = {}
75
+ return [rpc_value, false] if rpc_value.nil?
76
+
77
+ return [rpc_value, true] if descriptor_class.nil?
78
+
79
+ descriptor_class.entries.each do |entry|
80
+
81
+ value, is_serialized = deserialize_with_field_descriptor(entry, rpc_value[entry.name])
82
+
83
+ if is_serialized
84
+ new_hash[entry.name.to_sym] = value
85
+ end
86
+ end
87
+
88
+ [new_hash, true]
89
+ end
90
+
91
+
92
+ def self.deserialize_with_field_descriptor(field_descriptor, value)
93
+
94
+ return [value, false] if value.nil?
95
+
96
+ return [value, true] if field_descriptor.nil?
97
+
98
+ if field_descriptor.label == :repeated
99
+ return deserialize_with_repeated_field(field_descriptor, value)
100
+ end
101
+
102
+ if field_descriptor.type == :message
103
+ custom_encode = CUSTOM_ENCODED_TYPES[field_descriptor.subtype.msgclass]
104
+ repeated_encode = REPEATED_ENCODED_TYPES[field_descriptor.subtype.msgclass]
105
+ if custom_encode || repeated_encode
106
+ return [nil, false] if value.respond_to?(:kind) && value.kind == :exclude_value
107
+ return [field_descriptor.subtype.msgclass.decode_value(value), true]
108
+ end
109
+ if field_descriptor.subtype.is_a?(Google::Protobuf::Descriptor)
110
+ return deserialize_with_descriptor(field_descriptor.subtype, value) unless value.nil?
111
+ end
112
+
113
+ return [value.to_h, true]
114
+
115
+ end
116
+ [value, true]
117
+ end
118
+
119
+ def self.deserialize_with_repeated_field(field_descriptor, value)
120
+
121
+ return [value, false] if value.nil?
122
+
123
+ if field_descriptor.label == :repeated
124
+
125
+ if field_descriptor.subtype && field_descriptor.subtype.lookup("key")
126
+ if field_descriptor.subtype.lookup("value")
127
+ value_dup = ({}).dup
128
+ org_value = value || {}
129
+ org_value.keys.each do |k|
130
+ field_value, is_serialized = deserialize_with_field_descriptor(field_descriptor.subtype.lookup("value"), org_value[k])
131
+ if is_serialized
132
+ value_dup[k.to_sym] = field_value
133
+ end
134
+ end
135
+ return [value_dup, true]
136
+ else
137
+ return [value.to_h, true]
138
+ end
139
+ end
140
+
141
+ final_value = []
142
+ (value || []).map do |v|
143
+ field_value, is_serialized = deserialize_with_descriptor(field_descriptor.subtype, v)
144
+ final_value << field_value if is_serialized
145
+ end
146
+
147
+ return [final_value, true]
148
+ end
149
+ end
150
+ end
metadata ADDED
@@ -0,0 +1,128 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: grpc_serializer
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - kathir
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-07-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.17'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.17'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: grpc-tools
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.17.1
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.17.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: grpc
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.18.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.18.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: google-protobuf
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 3.6.1
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 3.6.1
97
+ description: A simple gem for nested grpc message encoding and decoding
98
+ email: kathirvalavan.ict@gmail.com
99
+ executables: []
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - lib/grpc_serializer.rb
104
+ homepage: https://rubygems.org/gems/grpc_serializer
105
+ licenses:
106
+ - MIT
107
+ metadata:
108
+ source_code_uri: https://github.com/kathirvalavan/grpc_serializer
109
+ post_install_message:
110
+ rdoc_options: []
111
+ require_paths:
112
+ - lib
113
+ required_ruby_version: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '2.3'
118
+ required_rubygems_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ requirements: []
124
+ rubygems_version: 3.0.9
125
+ signing_key:
126
+ specification_version: 4
127
+ summary: Ruby Grpc serilizer
128
+ test_files: []