468
|
1 from __future__ import print_function
|
469
|
2 import sys, json
|
|
3
|
|
4 def LoadSchema(file_path : str):
|
|
5 with open(file_path, 'r') as fp:
|
|
6 obj = json.load(fp)
|
|
7 return obj
|
|
8
|
|
9 class Type:
|
|
10 def __init__(self, canonicalTypeName:str, dependentTypes:str):
|
|
11 """dependent type is the list of canonical types this type depends on.
|
|
12 For instance, vector<map<string,int32>> depends on map<string,int32>
|
|
13 that, in turn, depends on string and int32 that, in turn, depend on
|
|
14 nothing"""
|
|
15 self.canonicalTypeName = canonicalTypeName
|
|
16 self.dependentTypes = dependentTypes
|
|
17 def getDependentTypes(self):
|
|
18 return self.dependentTypes
|
|
19 def getCppTypeName(self):
|
|
20 # C++: prefix map vector and string with std::map, std::vector and std::string
|
|
21 # replace int32 by int32_t
|
|
22 # replace float32 by float
|
|
23 # replace float64 by double
|
|
24 retVal : str = self.canonicalTypeName.replace("map","std::map")
|
|
25 retVal : str = self.canonicalTypeName.replace("vector","std::vector")
|
|
26 retVal : str = self.canonicalTypeName.replace("int32","int32_t")
|
|
27 retVal : str = self.canonicalTypeName.replace("float32","float")
|
|
28 retVal : str = self.canonicalTypeName.replace("float64","double")
|
|
29 return retVal
|
|
30 def getTypeScriptTypeName(self):
|
|
31 # TS: replace vector with Array and map with Map
|
|
32 # string remains string
|
|
33 # replace int32 by number
|
|
34 # replace float32 by number
|
|
35 # replace float64 by number
|
|
36 retVal : str = self.canonicalTypeName.replace("map","Map")
|
|
37 retVal : str = self.canonicalTypeName.replace("vector","Array")
|
|
38 retVal : str = self.canonicalTypeName.replace("int32","number")
|
|
39 retVal : str = self.canonicalTypeName.replace("float32","number")
|
|
40 retVal : str = self.canonicalTypeName.replace("float64","number")
|
|
41 retVal : str = self.canonicalTypeName.replace("bool","boolean")
|
|
42 return retVal
|
|
43
|
|
44 class Schema:
|
|
45 def __init__(self, root_prefix : str, defined_types : List[Type]):
|
|
46 self.root_prefix : str = root_prefix
|
|
47 self.defined_types : str = defined_types
|
|
48
|
|
49 def ProcessSchemaPaths(inputSchemas : list[str])
|
468
|
50
|
|
51
|
469
|
52 def ProcessSchemas(schemaPaths):
|
|
53 schemas = []
|
|
54 for schemaPath in schemaPaths:
|
|
55 schemas.append(LoadSchema(schemaPath))
|
|
56 return schemas
|
468
|
57
|
|
58 if __name__ == '__main__':
|
|
59 import argparse
|
|
60 parser = argparse.ArgumentParser(usage = """stonegentool.py [-h] [-o OUT_DIR] [-v] input_schemas
|
|
61 EXAMPLE: python command_gen.py -o "generated_files/" "mainSchema.json,App Specific Commands.json" """)
|
|
62 parser.add_argument("input_schemas", type=str,
|
|
63 help = "one or more schema files, as a comma-separated list of paths")
|
|
64 parser.add_argument("-o", "--out_dir", type=str, default=".",
|
|
65 help = """path of the directory where the files
|
|
66 will be generated. Default is current
|
|
67 working folder""")
|
|
68 parser.add_argument("-v", "--verbosity", action="count", default=0,
|
|
69 help = """increase output verbosity (0 == errors
|
|
70 only, 1 == some verbosity, 2 == nerd
|
|
71 mode""")
|
|
72
|
|
73 args = parser.parse_args()
|
469
|
74 inputSchemas = args.input_schemas.split(",")
|
|
75 outDir = args.out_dir
|
|
76
|
|
77 print("input schemas = " + str(inputSchemas))
|
|
78 print("out dir = " + str(outDir))
|
|
79
|
|
80 ProcessSchemaPaths(inputSchemas)
|
|
81
|
|
82
|
468
|
83
|
469
|
84 ###################
|
|
85 ## ATTIC ##
|
|
86 ###################
|
|
87
|
|
88 # this works
|
468
|
89
|
469
|
90 if False:
|
|
91 obj = json.loads("""{
|
|
92 "firstName": "Alice",
|
|
93 "lastName": "Hall",
|
|
94 "age": 35
|
|
95 }""")
|
|
96 print(obj)
|