vppapigen_json.py revision 75761b93
1# JSON generation
2import json
3
4
5def 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
17def 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
29def 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# Plugin entry point
63#
64def run(filename, s):
65    j = {}
66
67    j['types'] = (walk_defs([o for o in s['types']
68                             if o.__class__.__name__ == 'Typedef']))
69    j['messages'] = walk_defs(s['Define'], True)
70    j['unions'] = (walk_defs([o for o in s['types']
71                              if o.__class__.__name__ == 'Union']))
72    j['enums'] = (walk_enums([o for o in s['types']
73                              if o.__class__.__name__ == 'Enum']))
74    j['services'] = walk_services(s['Service'])
75    j['options'] = s['Option']
76    j['aliases'] = {o.name:o.alias for o in s['types'] if o.__class__.__name__ == 'Using'}
77    j['vl_api_version'] = hex(s['file_crc'])
78    return json.dumps(j, indent=4, separators=(',', ': '))
79