Skip to content

Commit 049e722

Browse files
committed
implement more apiwriter
1 parent 7eb3966 commit 049e722

File tree

1 file changed

+82
-6
lines changed

1 file changed

+82
-6
lines changed

apiwriter.py

Lines changed: 82 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11

22
def writeInline(writer, json_val):
3-
if isinstance(json_val, dict):
3+
if json_val is None:
4+
writer("null")
5+
elif isinstance(json_val, dict):
46
writer("{")
57
writeInlineFields(writer, json_val.keys(), "", "", json_val)
68
writer("}")
@@ -12,6 +14,8 @@ def writeInline(writer, json_val):
1214
writeInline(writer, val)
1315
prefix = ","
1416
writer("]")
17+
elif isinstance(json_val, bool):
18+
writer("true" if json_val else "false")
1519
elif isinstance(json_val, str):
1620
writer("\"{}\"".format(json_val))
1721
elif isinstance(json_val, int):
@@ -21,21 +25,90 @@ def writeInline(writer, json_val):
2125
else:
2226
import sys
2327
sys.exit("{}".format(type(json_val).__name__))
24-
2528

26-
def writeInlineFields(writer, fields, field_prefix, field_suffix, obj):
27-
separator = ""
29+
30+
def writeFieldName(writer, field_prefix, opt_comma, name):
31+
writer("{}{}\"{}\":".format(field_prefix, opt_comma, name))
32+
33+
def writeInlineFields(writer, fields, field_prefix, field_suffix, obj, separator=""):
2834
for field in fields:
29-
writer("{}{}\"{}\":".format(field_prefix, separator, field, field_suffix))
35+
writeFieldName(writer, field_prefix, separator, field)
3036
writeInline(writer, obj[field])
3137
writer(field_suffix)
3238
separator = ","
3339

40+
def writeInlineElements(writer, line_prefix, arr, separator=""):
41+
for element in arr:
42+
writer("\r\n{}{}".format(line_prefix, separator))
43+
writeInline(writer, element)
44+
separator = ","
45+
3446
def writeConstant(writer, prefix, constant):
3547
writer("\t{}{{\r\n".format(prefix))
3648
writeInlineFields(writer, ["Name","Type","ValueType","Value","Attrs"], "\t\t", "\r\n", constant)
3749
writer("\t}\r\n")
3850

51+
def writeComMethod(writer, method_separator, method):
52+
line_prefix = "\t\t\t"
53+
54+
writer("{}{}{{\r\n".format(line_prefix, method_separator))
55+
child_prefix = line_prefix + "\t"
56+
writeInlineFields(writer, ["Name", "SetLastError", "ReturnType", "Architectures", "Platform", "Attrs"], child_prefix, "\r\n", method)
57+
58+
writeFieldName(writer, child_prefix, ",", "Params")
59+
writer("[")
60+
writeInlineElements(writer, "\t\t\t\t\t", method["Params"])
61+
writer("\r\n{}]\r\n".format(child_prefix))
62+
63+
writer("{}}}\r\n".format(line_prefix))
64+
65+
def writeType(writer, line_prefix, type_separator, type_obj):
66+
writer("{}{}{{\r\n".format(line_prefix, type_separator))
67+
writeInlineFields(writer, ["Name", "Architectures", "Platform", "Kind"], line_prefix + "\t", "\r\n", type_obj)
68+
kind = type_obj["Kind"]
69+
child_prefix = line_prefix + "\t"
70+
if kind == "Enum":
71+
writeInlineFields(writer, ["Flags", "Scoped"], child_prefix, "\r\n", type_obj, separator=",")
72+
73+
writeFieldName(writer, child_prefix, ",", "Values")
74+
writer("[")
75+
writeInlineElements(writer, child_prefix + "\t", type_obj["Values"])
76+
writer("\r\n{}]\r\n".format(child_prefix))
77+
78+
writeInlineFields(writer, ["IntegerBase"], child_prefix, "\r\n", type_obj, separator=",")
79+
elif kind == "Struct" or kind == "Union":
80+
writeInlineFields(writer, ["Size", "PackingSize"], child_prefix, "\r\n", type_obj, separator=",")
81+
82+
writeFieldName(writer, child_prefix, ",", "Fields")
83+
writer("[")
84+
writeInlineElements(writer, child_prefix + "\t", type_obj["Fields"])
85+
writer("\r\n{}]\r\n".format(child_prefix))
86+
87+
writeFieldName(writer, child_prefix, ",", "NestedTypes")
88+
writer("[\r\n")
89+
nested_separator = ""
90+
for nested_type in type_obj["NestedTypes"]:
91+
writeType(writer, child_prefix, nested_separator, nested_type)
92+
nested_separator=","
93+
writer("{}]\r\n".format(child_prefix))
94+
95+
elif kind == "Com":
96+
writeInlineFields(writer, ["Guid", "Interface"], child_prefix, "\r\n", type_obj, separator=",")
97+
98+
writeFieldName(writer, child_prefix, ",", "Methods")
99+
writer("[\r\n")
100+
method_separator = ""
101+
for method in type_obj["Methods"]:
102+
writeComMethod(writer, method_separator, method)
103+
method_separator=","
104+
writer("{}]\r\n".format(child_prefix))
105+
106+
else:
107+
import sys
108+
sys.exit("Unhandled Kind '{}'".format(kind))
109+
#writeInlineFields(writer, ["Name","Architectures", "Type","ValueType","Value","Attrs"], "\t\t", "\r\n", constant)
110+
writer("{}}}\r\n".format(line_prefix))
111+
39112
def write(writer, api):
40113
writer("{\r\n")
41114
writer("\r\n")
@@ -47,7 +120,10 @@ def write(writer, api):
47120
writer("]\r\n")
48121
writer("\r\n")
49122
writer(",\"Types\":[\r\n")
50-
##
123+
prefix = ""
124+
for t in api["Types"]:
125+
writeType(writer, "\t", prefix, t)
126+
prefix = ","
51127
writer("]\r\n")
52128
writer("\r\n")
53129
writer(",\"Functions\":[\r\n")

0 commit comments

Comments
 (0)