stats: counters data model
[vpp.git] / src / tools / vppapigen / vppapigen_json.py
1 # JSON generation
2 import json
3
4
5 def walk_imports(s):
6     r = []
7     for e in s:
8         r.append(str(e))
9     return r
10
11
12 def walk_counters(s, pathset):
13     r = []
14     for e in s:
15         r2 = {'name': e.name, 'elements': e.block}
16         r.append(r2)
17
18     r3 = []
19     for p in pathset:
20         r3.append(p.paths)
21
22     return r, r3
23
24
25 def walk_enums(s):
26     r = []
27     for e in s:
28         d = []
29         d.append(e.name)
30         for b in e.block:
31             d.append(b)
32         d.append({'enumtype': e.enumtype})
33         r.append(d)
34     return r
35
36
37 def walk_services(s):
38     r = {}
39     for e in s:
40         d = {'reply': e.reply}
41         if e.stream:
42             d['stream'] = True
43         if e.stream_message:
44             d['stream_msg'] = e.stream_message
45         if e.events:
46             d['events'] = e.events
47         r[e.caller] = d
48     return r
49
50
51 def walk_defs(s, is_message=False):
52     r = []
53     for t in s:
54         d = []
55         d.append(t.name)
56         for b in t.block:
57             if b.type == 'Option':
58                 continue
59             if b.type == 'Field':
60                 if b.limit:
61                     d.append([b.fieldtype, b.fieldname, b.limit])
62                 else:
63                     d.append([b.fieldtype, b.fieldname])
64             elif b.type == 'Array':
65                 if b.lengthfield:
66                     d.append([b.fieldtype, b.fieldname,
67                               b.length, b.lengthfield])
68                 else:
69                     d.append([b.fieldtype, b.fieldname, b.length])
70             elif b.type == 'Union':
71                 pass
72             else:
73                 raise ValueError("Error in processing array type %s" % b)
74
75         if is_message and t.crc:
76             c = {}
77             c['crc'] = "{0:#0{1}x}".format(t.crc, 10)
78             d.append(c)
79
80         r.append(d)
81     return r
82
83
84 #
85 # Plugin entry point
86 #
87 def run(args, filename, s):
88     j = {}
89
90     j['types'] = (walk_defs([o for o in s['types']
91                              if o.__class__.__name__ == 'Typedef']))
92     j['messages'] = walk_defs(s['Define'], True)
93     j['unions'] = (walk_defs([o for o in s['types']
94                               if o.__class__.__name__ == 'Union']))
95     j['enums'] = (walk_enums([o for o in s['types']
96                               if o.__class__.__name__ == 'Enum']))
97     j['services'] = walk_services(s['Service'])
98     j['options'] = s['Option']
99     j['aliases'] = {o.name:o.alias for o in s['types'] if o.__class__.__name__ == 'Using'}
100     j['vl_api_version'] = hex(s['file_crc'])
101     j['imports'] = walk_imports(i for i in s['Import'])
102     j['counters'], j['paths'] = walk_counters(s['Counters'], s['Paths'])
103     return json.dumps(j, indent=4, separators=(',', ': '))