everscale-client-ruby 1.1.23

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.
@@ -0,0 +1,400 @@
1
+ require 'json'
2
+ require 'byebug'
3
+ require 'set'
4
+ require File.dirname(__FILE__) + '/helpers.rb'
5
+
6
+
7
+
8
+ class ApiConverter
9
+ include InstanceHelpers
10
+
11
+ attr_reader :api_hash
12
+
13
+ def initialize(api_json)
14
+ @api_hash = JSON.parse(api_json)
15
+ end
16
+
17
+ def convert
18
+ ruby_types = ApiRubyTypes.new(version: api_hash['version'], modules: [])
19
+
20
+ (api_hash['modules'] || []).each do |mod|
21
+ new_mod = convert_module(mod)
22
+ ruby_types.modules << new_mod
23
+ ruby_types.all_types.merge!(new_mod.types_hash)
24
+ end
25
+
26
+ ruby_types
27
+ end
28
+
29
+ private
30
+
31
+ def convert_module(mod)
32
+ new_module = Module.new(name: mod['name'], alias: [], functions: [], enums: [], types: [], summary: mod['summary'], description: mod['description'])
33
+ (mod['types'] || []).each do |type|
34
+ if type['type'] == 'EnumOfTypes'
35
+ new_enum, new_struct = convert_fucking_enum_of_types(type)
36
+ new_module.enums << new_enum
37
+ new_module.types << new_struct
38
+ new_module.types_hash[new_enum.name] = new_enum
39
+ new_module.types_hash[new_struct.name] = new_struct
40
+ elsif type['type'] == 'EnumOfConsts'
41
+ new_type = convertEnumOfConsts(type)
42
+ new_module.enums << new_type
43
+ new_module.types_hash[new_type.name] = new_type
44
+ elsif type['type'] == 'Struct'
45
+ new_type = convertStruct(type)
46
+ new_module.types << new_type
47
+ new_module.types_hash[new_type.name] = new_type
48
+ elsif type['type'] == 'Number'
49
+ new_type = convertTypeAlias(type)
50
+ new_module.alias << new_type
51
+ new_module.types_hash[new_type.name] = new_type
52
+ else
53
+ raise "Unkown NEW TYPE for module #{type['name']} \"types\": #{type['types']}"
54
+ end
55
+ end
56
+
57
+ # /// FUNCTIONS
58
+ (mod['functions'] || []).each do |function|
59
+ result = ""
60
+ if function['result']['type'] == "Generic"
61
+ ref_type = function['result']['generic_args'].first&.send(:[], 'type') || ""
62
+ if ref_type == "Ref"
63
+ ref_name = function['result']['generic_args'].first&.send(:[], 'ref_name') || ""
64
+ if ref_name[/^(.+)\.(.+)$/]
65
+ mod = $1
66
+ type = $2
67
+ result = "#{lib_prefix}#{type}"
68
+ else
69
+ raise "Bad function result ref_name: #{ref_name}, function name: #{function['name']}, result: #{function['result']}"
70
+ end
71
+ elsif ref_type == "None"
72
+ result = "Void"
73
+ end
74
+ else
75
+ raise "New function result type !"
76
+ end
77
+
78
+ # /// function
79
+ newFunction = StructFunction.new(name: checkFunctionName(function['name']), arguments: [], result: result, summary: function['summary'], description: function['description'])
80
+ # /// FUNCTION PARAMETERS
81
+ paramsCount = 0
82
+ (function['params'] || []).each do |parameter|
83
+ if parameter['name'] == "params"
84
+ paramsCount += 1
85
+ if parameter['type'] == "Ref"
86
+ ref_name = parameter['ref_name'] || ""
87
+ if ref_name[/^(.+)\.(.+)$/]
88
+ mod = $1
89
+ type = $2
90
+ newFunction.arguments << FunctionArgument.new(name: "payload", type: "#{lib_prefix}#{type}")
91
+ else
92
+ raise "Bad function params ref_name: #{ref_name}, function name: #{function['name']}, result: #{function['result']}"
93
+ end
94
+ else
95
+ raise "NEW CASE! New parameter type: #{parameter['type']}"
96
+ end
97
+ end
98
+ raise "NEW CASE ! More then one parameter for functions !" if paramsCount > 1
99
+ end
100
+
101
+ new_module.functions << newFunction
102
+ end
103
+
104
+ new_module
105
+ end
106
+
107
+ def convertTypeAlias(from)
108
+ TypeAlias.new(name: "#{lib_prefix}#{from['name']}", type: generateType(from))
109
+ end
110
+
111
+ def convertStruct(from)
112
+ result = TypeStruct.new(name: "#{lib_prefix}#{from['name']}", parents: [], fields: [], functions: [])
113
+ (from['struct_fields'] || []).each do |field|
114
+ if isValidPropertyName(field['name'])
115
+ type = generateType(field)
116
+ if ( (from['name'] || "")[/Params/] || (field['name'] || "")[/input/]) && type[/Value/]
117
+ type = "Value"
118
+ elsif (field['name'] || "")[/^dictionary$/]
119
+ type = "#{lib_prefix}MnemonicDictionary"
120
+ elsif type[/Abi<Optional>/]
121
+ type = "Value<Optional>"
122
+ elsif type[/Abi/]
123
+ type = "Value"
124
+ end
125
+ property = StructField.new(name: checkPropertyName(field['name']), type: type, summary: field['summary'], description: field['description'])
126
+ result.fields << property
127
+ end
128
+ end
129
+
130
+ result
131
+ end
132
+
133
+ private def checkPropertyName(name)
134
+ result = ""
135
+ raise "Property Name is nil" unless name
136
+
137
+ case name
138
+ when "public"
139
+ result = "public"
140
+ else
141
+ result = name
142
+ end
143
+
144
+ return result
145
+ end
146
+
147
+ private def checkFunctionName(name)
148
+ result = ""
149
+ raise "Property Name is nil" unless name
150
+ case name
151
+ when "init"
152
+ result = "init"
153
+ else
154
+ result = name
155
+ end
156
+
157
+ return result
158
+ end
159
+
160
+ private def isValidPropertyName(name)
161
+ !(name || " ")[/\s/]
162
+ end
163
+
164
+ def convertEnumOfConsts(from)
165
+ result = TypeEnum.new(name: "#{lib_prefix}#{from['name']}", parents: [], cases: [], summary: from['summary'], description: from['description'])
166
+ (from['enum_consts'] || []).each do |enumConst|
167
+ caseName = enumConst['name']
168
+ caseValue = enumConst['value']
169
+ result.cases << EnumCase.new(name: caseName, value: caseValue, summary: enumConst['summary'], description: enumConst['description'])
170
+ end
171
+
172
+ return result
173
+ end
174
+
175
+ def convert_fucking_enum_of_types(enum)
176
+ result = [
177
+ TypeEnum.new(name: generate_enum_name(enum['name']), parents: [], cases: []),
178
+ TypeStruct.new(name: generate_struct_name(enum['name']), parents: [], fields: [], functions: [], summary: enum['summary'], description: enum['description'])
179
+ ]
180
+ properties_name_set = Set.new
181
+ properties = []
182
+ (enum['enum_types'] || []).each do |enum_type|
183
+ result[0].cases << EnumCase.new(name: enum_type['name'], value: enum_type['name'])
184
+ (enum_type['struct_fields'] || []).each do |field|
185
+ if !properties_name_set.include?(field['name'])
186
+ properties << field
187
+ end
188
+ properties_name_set << field['name']
189
+ end
190
+ end
191
+
192
+ result[1].fields << StructField.new(name: "type", type: generate_enum_name(enum['name']))
193
+ properties.each do |property|
194
+ type = generateType(property)
195
+ if property['name'][/^dictionary$/]
196
+ type = "#{lib_prefix}MnemonicDictionary"
197
+ end
198
+ result[1].fields << StructField.new(name: property['name'], type: type, summary: property['summary'], description: property['description'])
199
+ end
200
+ result
201
+ end
202
+
203
+ private def generateSimpleType(type)
204
+ tempType = ""
205
+
206
+ if type['type'] == "Ref"
207
+ if type['ref_name'] == "Value" || type['ref_name'] == "API"
208
+ tempType = "Value"
209
+ else
210
+ return type['optional'] ? "#{generateRefType(type['ref_name'] || "nil")}<Optional>" : generateRefType(type['ref_name'] || "nil")
211
+ end
212
+ else
213
+ tempType = type['type']
214
+ end
215
+ tempType = "#{tempType}<Optional>" if type['optional']
216
+
217
+ tempType
218
+ end
219
+
220
+ private def generateRefType(type)
221
+ result = ""
222
+
223
+ if type[/(.+)\.(.+)/]
224
+ mod = $1
225
+ typeName = $2
226
+ result = "#{lib_prefix}#{typeName}"
227
+ else
228
+ result = "#{lib_prefix}#{type}"
229
+ end
230
+
231
+ result
232
+ end
233
+
234
+ private def generateType(type)
235
+ if type['type'] == "Optional" && type['optional_inner']
236
+ type['optional'] = true
237
+ type['optional_inner']['optional'] = true
238
+ if type['optional_inner']['type'] == "Optional"
239
+ return generateType(type['optional_inner'])
240
+ else
241
+ return generateSimpleType(type['optional_inner'])
242
+ end
243
+ else
244
+ return generateSimpleType(type)
245
+ end
246
+ end
247
+
248
+ private def generate_enum_name(name)
249
+ "#{lib_prefix}#{name}#{lib_enum_postfix}"
250
+ end
251
+
252
+ private def generate_struct_name(name)
253
+ "#{lib_prefix}#{name}"
254
+ end
255
+ end
256
+
257
+
258
+ class ApiRubyTypes
259
+ attr_accessor :version
260
+ attr_accessor :modules
261
+ attr_accessor :all_types
262
+
263
+ def initialize(params)
264
+ @all_types = {}
265
+ params.each do |k, v|
266
+ if self.respond_to?(k.to_sym)
267
+ instance_variable_set("@#{k}".to_sym, v)
268
+ end
269
+ end
270
+ end
271
+ end
272
+
273
+ class Module
274
+ attr_accessor :name
275
+ attr_accessor :summary
276
+ attr_accessor :description
277
+ attr_accessor :alias
278
+ attr_accessor :enums
279
+ attr_accessor :types
280
+ attr_accessor :types_hash
281
+ attr_accessor :functions
282
+ attr_accessor :summary
283
+ attr_accessor :description
284
+
285
+ def initialize(params)
286
+ @types_hash = {}
287
+ params.each do |k, v|
288
+ if self.respond_to?(k.to_sym)
289
+ instance_variable_set("@#{k}".to_sym, v)
290
+ end
291
+ end
292
+ end
293
+ end
294
+
295
+ class TypeAlias
296
+ attr_accessor :name
297
+ attr_accessor :type
298
+ attr_accessor :summary
299
+ attr_accessor :description
300
+
301
+ def initialize(params)
302
+ params.each do |k, v|
303
+ if self.respond_to?(k.to_sym)
304
+ instance_variable_set("@#{k}".to_sym, v)
305
+ end
306
+ end
307
+ end
308
+ end
309
+
310
+ class TypeEnum
311
+ attr_accessor :name
312
+ attr_accessor :parents
313
+ attr_accessor :cases
314
+ attr_accessor :summary
315
+ attr_accessor :description
316
+
317
+ def initialize(params)
318
+ params.each do |k, v|
319
+ if self.respond_to?(k.to_sym)
320
+ instance_variable_set("@#{k}".to_sym, v)
321
+ end
322
+ end
323
+ end
324
+ end
325
+
326
+ class EnumCase
327
+ attr_accessor :name
328
+ attr_accessor :value
329
+ attr_accessor :summary
330
+ attr_accessor :description
331
+
332
+ def initialize(params)
333
+ params.each do |k, v|
334
+ if self.respond_to?(k)
335
+ instance_variable_set("@#{k}".to_sym, v)
336
+ end
337
+ end
338
+ end
339
+ end
340
+
341
+ class TypeStruct
342
+ attr_accessor :name
343
+ attr_accessor :parents
344
+ attr_accessor :fields
345
+ attr_accessor :functions
346
+ attr_accessor :summary
347
+ attr_accessor :description
348
+
349
+ def initialize(params)
350
+ params.each do |k, v|
351
+ if self.respond_to?(k.to_sym)
352
+ instance_variable_set("@#{k}".to_sym, v)
353
+ end
354
+ end
355
+ end
356
+ end
357
+
358
+ class StructField
359
+ attr_accessor :name
360
+ attr_accessor :type
361
+ attr_accessor :summary
362
+ attr_accessor :description
363
+
364
+ def initialize(params)
365
+ params.each do |k, v|
366
+ if self.respond_to?(k.to_sym)
367
+ instance_variable_set("@#{k}".to_sym, v)
368
+ end
369
+ end
370
+ end
371
+ end
372
+
373
+ class StructFunction
374
+ attr_accessor :name
375
+ attr_accessor :arguments
376
+ attr_accessor :result
377
+ attr_accessor :summary
378
+ attr_accessor :description
379
+
380
+ def initialize(params)
381
+ params.each do |k, v|
382
+ if self.respond_to?(k.to_sym)
383
+ instance_variable_set("@#{k}".to_sym, v)
384
+ end
385
+ end
386
+ end
387
+ end
388
+
389
+ class FunctionArgument
390
+ attr_accessor :name
391
+ attr_accessor :type
392
+
393
+ def initialize(params)
394
+ params.each do |k, v|
395
+ if self.respond_to?(k.to_sym)
396
+ instance_variable_set("@#{k}".to_sym, v)
397
+ end
398
+ end
399
+ end
400
+ end