summaryrefslogtreecommitdiff
path: root/tools/InterfaceGenerator/Generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/InterfaceGenerator/Generator.py')
-rwxr-xr-xtools/InterfaceGenerator/Generator.py116
1 files changed, 116 insertions, 0 deletions
diff --git a/tools/InterfaceGenerator/Generator.py b/tools/InterfaceGenerator/Generator.py
new file mode 100755
index 000000000..5b5894bc0
--- /dev/null
+++ b/tools/InterfaceGenerator/Generator.py
@@ -0,0 +1,116 @@
+"""
+Generator application that generates c++ interfaces code from xml description
+
+usage: Generator.py [-h] --parser-type {sdlrpcv2}
+ source-xml namespace output-dir
+
+SmartSchema interface generator
+
+positional arguments:
+ source-xml
+ namespace
+ output-dir
+
+optional arguments:
+ -h, --help show this help message and exit
+ --parser-type {sdlrpcv2}
+"""
+
+import os.path
+import argparse
+import errno
+import sys
+
+import generator.parsers.SDLRPCV1
+import generator.parsers.SDLRPCV2
+import generator.parsers.JSONRPC
+import generator.generators.SmartFactorySDLRPC
+import generator.generators.SmartFactoryJSONRPC
+
+from generator.parsers.RPCBase import ParseError
+from generator.generators.SmartFactoryBase import GenerateError
+
+SUPPORTED_FORMATS = {
+ "sdlrpcv1": (generator.parsers.SDLRPCV1.Parser,
+ generator.generators.SmartFactorySDLRPC.CodeGenerator),
+ "sdlrpcv2": (generator.parsers.SDLRPCV2.Parser,
+ generator.generators.SmartFactorySDLRPC.CodeGenerator),
+ "jsonrpc": (generator.parsers.JSONRPC.Parser,
+ generator.generators.SmartFactoryJSONRPC.CodeGenerator)
+}
+
+
+def _create_parser():
+ """Create parser for parsing command-line arguments.
+
+ Returns an instance of argparse.ArgumentParser
+
+ """
+
+ parser = argparse.ArgumentParser(
+ description="SmartSchema interface generator"
+ )
+ parser.add_argument("source-xml")
+ parser.add_argument("namespace")
+ parser.add_argument("output-dir")
+ parser.add_argument("--parser-type",
+ choices=SUPPORTED_FORMATS.keys(),
+ required=True)
+ return parser
+
+
+def _handle_fatal_error(error):
+ """Handle fatal error during parsing or code generation.
+
+ Keyword arguments:
+ error -- base exception to handle.
+
+ """
+
+ print(error.message)
+ print
+ sys.exit(errno.EINVAL)
+
+
+def main():
+ """Main function of the generator that does actual work."""
+
+ args = vars(_create_parser().parse_args())
+
+ src_xml = args["source-xml"]
+ src_xml_name = os.path.splitext(os.path.basename(src_xml))[0]
+ namespace = args["namespace"]
+ output_dir = args["output-dir"]
+ parser_type = args["parser_type"]
+
+ print("""
+Generating interface source code with following parameters:
+ Source xml : {0}
+ Namespace : {1}
+ Output directory: {2}
+ Parser type : {3}
+""".format(src_xml, namespace, output_dir, parser_type))
+
+ # Select required parser and code generator
+ parser = SUPPORTED_FORMATS[parser_type][0]()
+ code_generator = SUPPORTED_FORMATS[parser_type][1]()
+
+ # Convert incoming xml to internal model
+ try:
+ interface = parser.parse(args["source-xml"])
+ except ParseError as error:
+ _handle_fatal_error(error)
+
+ # Generate SmartFactory source code from internal model
+ try:
+ code_generator.generate(interface,
+ src_xml_name,
+ namespace,
+ output_dir)
+ except GenerateError as error:
+ _handle_fatal_error(error)
+
+ print("Done.")
+
+if __name__ == '__main__':
+ main()