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