14 def walk_counters(s, pathset):
17 r2 = {"name": e.name, "elements": e.block}
34 d.append({"enumtype": e.enumtype})
42 d = {"reply": e.reply}
46 d["stream_msg"] = e.stream_message
48 d["events"] = e.events
53 def walk_defs(s, is_message=False):
59 if b.type == "Option":
63 d.append([b.fieldtype, b.fieldname, b.limit])
65 d.append([b.fieldtype, b.fieldname])
66 elif b.type == "Array":
68 d.append([b.fieldtype, b.fieldname, b.length, b.lengthfield])
70 d.append([b.fieldtype, b.fieldname, b.length])
71 elif b.type == "Union":
74 raise ValueError("Error in processing array type %s" % b)
76 if is_message and t.crc:
78 c["crc"] = "{0:#0{1}x}".format(t.crc, 10)
79 c["options"] = t.options
81 c["comment"] = t.comment
91 def run(output_dir, filename, s):
94 j["types"] = walk_defs([o for o in s["types"] if o.__class__.__name__ == "Typedef"])
95 j["messages"] = walk_defs(s["Define"], True)
96 j["unions"] = walk_defs([o for o in s["types"] if o.__class__.__name__ == "Union"])
97 j["enums"] = walk_enums([o for o in s["types"] if o.__class__.__name__ == "Enum"])
98 j["enumflags"] = walk_enums(
99 [o for o in s["types"] if o.__class__.__name__ == "EnumFlag"]
101 j["services"] = walk_services(s["Service"])
102 j["options"] = s["Option"]
104 o.name: o.alias for o in s["types"] if o.__class__.__name__ == "Using"
106 j["vl_api_version"] = hex(s["file_crc"])
107 j["imports"] = walk_imports(i for i in s["Import"])
108 j["counters"], j["paths"] = walk_counters(s["Counters"], s["Paths"])
109 return json.dumps(j, indent=4, separators=(",", ": "))