api: autogenerate api trace print/endian
[vpp.git] / src / tools / vppapigen / vppapigen_json.py
1 # JSON generation
2 import json
3
4
5 def walk_enums(s):
6     r = []
7     for e in s:
8         d = []
9         d.append(e.name)
10         for b in e.block:
11             d.append(b)
12         d.append({'enumtype': e.enumtype})
13         r.append(d)
14     return r
15
16
17 def walk_services(s):
18     r = {}
19     for e in s:
20         d = {'reply': e.reply}
21         if e.stream:
22             d['stream'] = True
23         if e.events:
24             d['events'] = e.events
25         r[e.caller] = d
26     return r
27
28
29 def walk_defs(s, is_message=False):
30     r = []
31     for t in s:
32         d = []
33         d.append(t.name)
34         for b in t.block:
35             if b.type == 'Option':
36                 continue
37             if b.type == 'Field':
38                 if b.limit:
39                     d.append([b.fieldtype, b.fieldname, b.limit])
40                 else:
41                     d.append([b.fieldtype, b.fieldname])
42             elif b.type == 'Array':
43                 if b.lengthfield:
44                     d.append([b.fieldtype, b.fieldname,
45                               b.length, b.lengthfield])
46                 else:
47                     d.append([b.fieldtype, b.fieldname, b.length])
48             elif b.type == 'Union':
49                 pass
50             else:
51                 raise ValueError("Error in processing array type %s" % b)
52
53         if is_message and t.crc:
54             c = {}
55             c['crc'] = "{0:#0{1}x}".format(t.crc, 10)
56             d.append(c)
57
58         r.append(d)
59     return r
60
61
62 #
63 # Plugin entry point
64 #
65 def run(filename, s):
66     j = {}
67
68     j['types'] = (walk_defs([o for o in s['types']
69                              if o.__class__.__name__ == 'Typedef']))
70     j['messages'] = walk_defs(s['Define'], True)
71     j['unions'] = (walk_defs([o for o in s['types']
72                               if o.__class__.__name__ == 'Union']))
73     j['enums'] = (walk_enums([o for o in s['types']
74                               if o.__class__.__name__ == 'Enum']))
75     j['services'] = walk_services(s['Service'])
76     j['options'] = s['Option']
77     j['aliases'] = {k: v.alias for k, v in s['Alias'].items()}
78     j['vl_api_version'] = hex(s['file_crc'])
79     return json.dumps(j, indent=4, separators=(',', ': '))