ic_agent 0.1.1

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,410 @@
1
+ require 'treetop'
2
+
3
+ module IcAgent
4
+ module Ast
5
+ module Nodes
6
+ class NamedNode < Treetop::Runtime::SyntaxNode
7
+ def title
8
+ :named_node
9
+ end
10
+
11
+ def to_array
12
+ [title] + elements.map(&:to_array)
13
+ end
14
+
15
+ def to_s
16
+ "#{title.to_s.upcase} #{elements_to_s}"
17
+ end
18
+
19
+ def elements_to_s
20
+ elements.map(&:to_s).join("\n")
21
+ end
22
+ end
23
+
24
+ class Instruction < NamedNode
25
+ def title
26
+ :instruction
27
+ end
28
+
29
+ def to_s
30
+ elements_to_s
31
+ end
32
+ end
33
+
34
+ class Comment < NamedNode
35
+ def title
36
+ :comment
37
+ end
38
+
39
+ def to_s
40
+ "# #{elements[0].to_s}"
41
+ end
42
+ end
43
+
44
+ class DIDFile < NamedNode
45
+ def title
46
+ :did_file
47
+ end
48
+
49
+ def to_s
50
+ elements_to_s
51
+ end
52
+ end
53
+
54
+ class TypeDeclaration < NamedNode
55
+ def title
56
+ :type_declaration
57
+ end
58
+
59
+ def type_param_name
60
+ elements[0].text_value
61
+ end
62
+
63
+ def type_param_content
64
+ elements[1].text_value.gsub("\n", '').gsub(';}', '}')
65
+ end
66
+
67
+ def type_root_opt_code
68
+ elements[1].opt_code
69
+ end
70
+
71
+ def type_child_items
72
+ if elements && elements[1] && elements[1].elements && elements[1].elements[0]
73
+ elements[1].elements[0].elements
74
+ else
75
+ []
76
+ end
77
+ end
78
+
79
+ def type_child_item_keys
80
+ names = []
81
+ type_child_items.each do |ele|
82
+ names << ele.elements[0].text_value.strip
83
+ end
84
+ names
85
+ end
86
+
87
+ def type_child_item_values
88
+ values = []
89
+ type_child_items.each do |ele|
90
+
91
+ # get multi type value
92
+ replaced_hash = {}
93
+ modified_str = ele.text_value.gsub("\n", '').gsub(/record\s*{[^{}]*}/) do |match|
94
+ rad_id = rand(100000..999999)
95
+ type_name = "record_#{rad_id}"
96
+ replaced_hash[type_name] = match
97
+ type_name
98
+ end
99
+ modified_str = modified_str.gsub(/variant\s*{[^{}]*}/) do |match|
100
+ rad_id = rand(100000..999999)
101
+ type_name = "variant_#{rad_id}"
102
+ replaced_hash[type_name] = match
103
+ type_name
104
+ end
105
+ replaced_hash.each_key do |key|
106
+ item_arr = replaced_hash[key].strip.split(';')
107
+ item_arr.each do |item|
108
+ multi_item_arr = item.strip.split(':')
109
+ if multi_item_arr.size > 1
110
+ item_value_arr = multi_item_arr[1].strip.split(' ').collect { |v| v.strip.gsub(';', '') }
111
+ item_value_arr.delete('{')
112
+ item_value_arr.delete('}')
113
+ item_value_arr.delete('{}')
114
+ values << item_value_arr
115
+ else
116
+ values << []
117
+ end
118
+ end
119
+ end
120
+
121
+ # get root type value
122
+ item_arr = modified_str.strip.split(':')
123
+ if item_arr.size > 1
124
+ item_value_arr = item_arr[1].strip.split(' ').collect { |v| v.strip.gsub(';', '') }
125
+ item_value_arr.delete('{')
126
+ item_value_arr.delete('}')
127
+ item_value_arr.delete('{}')
128
+ item_value_arr -= replaced_hash.keys
129
+ values << item_value_arr
130
+ else
131
+ values << []
132
+ end
133
+ end
134
+ values
135
+ end
136
+
137
+ def type_child_refer_items
138
+ child_args = type_child_item_values.flatten - IcAgent::Candid::ALL_TYPES
139
+ child_args.uniq
140
+ end
141
+
142
+ def to_s
143
+ text_value
144
+ end
145
+
146
+ def to_obj
147
+ {
148
+ 'type_param_name' => type_param_name,
149
+ 'type_root_opt_code' => type_root_opt_code,
150
+ 'type_child_item_keys' => type_child_item_keys,
151
+ 'type_child_item_values' => type_child_item_values
152
+ }
153
+ end
154
+ end
155
+
156
+ class BaseType < NamedNode
157
+ def title
158
+ :base_type
159
+ end
160
+
161
+ def to_s
162
+ elements_to_s
163
+ end
164
+ end
165
+
166
+ class BaseTypeSingle < NamedNode
167
+ def title
168
+ :base_type_single
169
+ end
170
+
171
+ def to_s
172
+ elements_to_s
173
+ end
174
+
175
+ def opt_code
176
+ 'single'
177
+ end
178
+ end
179
+
180
+ class BaseTypeRecord < NamedNode
181
+ def title
182
+ :base_type_record
183
+ end
184
+
185
+ def to_s
186
+ elements_to_s
187
+ end
188
+
189
+ def opt_code
190
+ 'record'
191
+ end
192
+ end
193
+
194
+ class BaseTypeKey < NamedNode
195
+ def title
196
+ :base_type_key
197
+ end
198
+
199
+ def to_s
200
+ elements_to_s
201
+ end
202
+ end
203
+
204
+ class BaseTypeVariant < NamedNode
205
+ def title
206
+ :base_type_variant
207
+ end
208
+
209
+ def to_s
210
+ elements_to_s
211
+ end
212
+
213
+ def opt_code
214
+ 'variant'
215
+ end
216
+ end
217
+
218
+ class BaseTypeFunc < NamedNode
219
+ def title
220
+ :base_type_func
221
+ end
222
+
223
+ def to_s
224
+ elements_to_s
225
+ end
226
+
227
+ def opt_code
228
+ 'func'
229
+ end
230
+ end
231
+
232
+ class BaseTypeOpt < NamedNode
233
+ def title
234
+ :base_type_opt
235
+ end
236
+
237
+ def to_s
238
+ elements_to_s
239
+ end
240
+
241
+ def opt_code
242
+ 'opt'
243
+ end
244
+ end
245
+
246
+ class BaseTypeVec < NamedNode
247
+ def title
248
+ :base_type_vec
249
+ end
250
+
251
+ def to_s
252
+ elements_to_s
253
+ end
254
+
255
+ def opt_code
256
+ 'vec'
257
+ end
258
+ end
259
+
260
+ class BaseTypeOther < NamedNode
261
+ def title
262
+ :base_type_other
263
+ end
264
+
265
+ def to_s
266
+ elements_to_s
267
+ end
268
+
269
+ def opt_code
270
+ text_value
271
+ end
272
+ end
273
+
274
+ class BaseTypeContent < NamedNode
275
+ def title
276
+ :base_type_content
277
+ end
278
+
279
+ def to_s
280
+ elements_to_s
281
+ end
282
+ end
283
+
284
+ class BaseTypeChild < NamedNode
285
+ def title
286
+ :base_type_child
287
+ end
288
+
289
+ def to_s
290
+ elements_to_s
291
+ end
292
+ end
293
+
294
+ class TypeName < NamedNode
295
+ def title
296
+ :type_name
297
+ end
298
+
299
+ def to_s
300
+ elements_to_s
301
+ end
302
+ end
303
+
304
+ class Service < NamedNode
305
+ def title
306
+ :ic_service
307
+ end
308
+
309
+ def to_s
310
+ elements_to_s
311
+ end
312
+ end
313
+
314
+ class IcServiceName < NamedNode
315
+ def title
316
+ :ic_service_name
317
+ end
318
+
319
+ def to_s
320
+ "# #{elements[0].to_s}"
321
+ end
322
+ end
323
+
324
+ class IcServiceMethods < NamedNode
325
+ def title
326
+ :ic_service_methods
327
+ end
328
+
329
+ def value
330
+ elements.map { |update| update.value }
331
+ end
332
+ end
333
+
334
+ class IcServiceMethodName < NamedNode
335
+ def title
336
+ :ic_service_method_name
337
+ end
338
+ end
339
+
340
+ class IcServiceItem < NamedNode
341
+ def title
342
+ :ic_service_item
343
+ end
344
+
345
+ def to_s
346
+ elements_to_s
347
+ end
348
+
349
+ def to_obj
350
+ obj = {}
351
+ elements.each do |element|
352
+ obj[element.title.to_s] = element.text_value
353
+ end
354
+ obj
355
+ end
356
+ end
357
+
358
+ class IcServiceParam < NamedNode
359
+ def title
360
+ :ic_service_param
361
+ end
362
+
363
+ def to_s
364
+ "# #{elements[0].to_s}"
365
+ end
366
+ end
367
+
368
+ class IcServiceName < NamedNode
369
+ def title
370
+ :ic_service_name
371
+ end
372
+
373
+ def to_s
374
+ "# #{elements[0].to_s}"
375
+ end
376
+ end
377
+
378
+ class IcServiceMethodParams < NamedNode
379
+ def title
380
+ :ic_service_method_params
381
+ end
382
+
383
+ def to_s
384
+ elements_to_s
385
+ end
386
+ end
387
+
388
+ class IcServiceMethodReturn < NamedNode
389
+ def title
390
+ :ic_service_method_return
391
+ end
392
+
393
+ def to_s
394
+ elements_to_s
395
+ end
396
+ end
397
+
398
+ class IcServiceMethodQuery < NamedNode
399
+ def title
400
+ :ic_service_method_query
401
+ end
402
+
403
+ def to_s
404
+ elements_to_s
405
+ end
406
+ end
407
+ end
408
+ end
409
+ end
410
+
@@ -0,0 +1,17 @@
1
+ require 'treetop'
2
+
3
+ module IcAgent
4
+ module Ast
5
+ module Nodes
6
+ class StringLiteral < Treetop::Runtime::SyntaxNode
7
+ def to_array
8
+ self.text_value
9
+ end
10
+
11
+ def to_s
12
+ self.text_value
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,85 @@
1
+ require 'treetop'
2
+
3
+ module IcAgent
4
+ module Ast
5
+ class Parser
6
+ attr_accessor :parser, :tree
7
+
8
+ def initialize
9
+ Treetop.load(File.expand_path(File.join(File.dirname(__FILE__), 'did_grammar.treetop')))
10
+ @parser = DIDGrammarParser.new
11
+ end
12
+
13
+ def parse(data, return_type = :string)
14
+ tree = @parser.parse(data)
15
+
16
+ raise Exception, "Parse error at offset: #{@parser.index} #{@parser.failure_reason}" if tree.nil?
17
+
18
+ # this edits the tree in place
19
+ clean_tree(tree)
20
+
21
+ @tree = tree
22
+ tree
23
+ end
24
+
25
+ def clean_tree(root_node)
26
+ return if root_node.elements.nil?
27
+
28
+ root_node.elements.delete_if { |node| node.class.name == 'Treetop::Runtime::SyntaxNode' }
29
+ root_node.elements.each { |node| self.clean_tree(node) }
30
+ end
31
+
32
+ def ic_service
33
+ tree.elements.each do |ele|
34
+ return ele if ele.title == :ic_service
35
+ end
36
+ nil
37
+ end
38
+
39
+ def ic_types
40
+ type_arr = []
41
+ tree.elements.each do |ele|
42
+ type_arr << ele if ele.title == :type_declaration
43
+ end
44
+ type_arr
45
+ end
46
+
47
+ def ic_types_obj
48
+ obj_arr = []
49
+ ic_types.each do |ic_type|
50
+ obj_arr << ic_type.to_obj
51
+ end
52
+ obj_arr
53
+ end
54
+
55
+ def ic_service_methods
56
+ ic_service_tree = ic_service
57
+ unless ic_service_tree.empty?
58
+ ic_service_tree.elements.each do |ele|
59
+ return ele if ele.title == :ic_service_methods
60
+ end
61
+ end
62
+ nil
63
+ end
64
+
65
+ def ic_type_name(ic_type)
66
+ ic_type.type_param_name
67
+ end
68
+
69
+ def ic_type_names
70
+ names_arr = []
71
+ ic_types.each do |ic_type|
72
+ names_arr << ic_type_name(ic_type)
73
+ end
74
+ names_arr
75
+ end
76
+
77
+ def ic_type_by_name(type_name)
78
+ ic_types.each do |ic_type|
79
+ return ic_type if type_name == ic_type_name(ic_type)
80
+ end
81
+ nil
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,19 @@
1
+ module IcAgent
2
+ module Ast
3
+ class Writer
4
+ def initialize(tree)
5
+ @tree = tree
6
+ end
7
+
8
+ def write(return_type = :string)
9
+ if return_type == :tree
10
+ @tree
11
+ elsif return_type == :array
12
+ @tree.to_array
13
+ else
14
+ @tree.to_s
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end