everscale-client-ruby 1.1.23

Sign up to get free protection for your applications and to get access to all the features.
@@ -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