Mercurial > hg > orthanc-stone
comparison Resources/CodeGeneration/stonegentool.py @ 494:fc17251477d6 bgo-commands-codegen
TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
author | bgo-osimis |
---|---|
date | Sat, 23 Feb 2019 10:18:13 +0100 |
parents | 6fbf2eae7c88 |
children | 8b6ceae45ba0 |
comparison
equal
deleted
inserted
replaced
493:6fbf2eae7c88 | 494:fc17251477d6 |
---|---|
1 import json | 1 import json |
2 import yaml | 2 import yaml |
3 import re | 3 import re |
4 import os | |
4 import sys | 5 import sys |
5 from jinja2 import Template | 6 from jinja2 import Template |
6 from typing import ( | 7 from typing import ( |
7 Any, | 8 Any, |
8 Dict, | 9 Dict, |
115 # replace float32 by float | 116 # replace float32 by float |
116 # replace float64 by double | 117 # replace float64 by double |
117 retVal: str = canonicalTypename | 118 retVal: str = canonicalTypename |
118 retVal = retVal.replace("map", "std::map") | 119 retVal = retVal.replace("map", "std::map") |
119 retVal = retVal.replace("vector", "std::vector") | 120 retVal = retVal.replace("vector", "std::vector") |
121 retVal = retVal.replace("string", "std::string") | |
120 retVal = retVal.replace("int32", "int32_t") | 122 retVal = retVal.replace("int32", "int32_t") |
121 retVal = retVal.replace("float32", "float") | 123 retVal = retVal.replace("float32", "float") |
122 retVal = retVal.replace("float64", "double") | 124 retVal = retVal.replace("float64", "double") |
123 return retVal | 125 return retVal |
124 | 126 |
135 retVal = retVal.replace("float32", "number") | 137 retVal = retVal.replace("float32", "number") |
136 retVal = retVal.replace("float64", "number") | 138 retVal = retVal.replace("float64", "number") |
137 retVal = retVal.replace("bool", "boolean") | 139 retVal = retVal.replace("bool", "boolean") |
138 return retVal | 140 return retVal |
139 | 141 |
140 def NeedsConstruction(canonTypename): | 142 def NeedsTsConstruction(enums: Dict, tsType: str): |
143 if tsType == 'boolean': | |
144 return False | |
145 elif tsType == 'number': | |
146 return False | |
147 elif tsType == 'string': | |
148 return False | |
149 else: | |
150 enumNames = [] | |
151 for enum in enums: | |
152 enumNames.append(enum['name']) | |
153 if tsType in enumNames: | |
154 return False | |
141 return True | 155 return True |
156 | |
157 def NeedsCppConstruction(canonTypename): | |
158 return False | |
142 | 159 |
143 def RegisterTemplateFunction(template,func): | 160 def RegisterTemplateFunction(template,func): |
144 """Makes a function callable by a jinja2 template""" | 161 """Makes a function callable by a jinja2 template""" |
145 template.globals[func.__name__] = func | 162 template.globals[func.__name__] = func |
146 return func | 163 return func |
147 | 164 |
148 def MakeTemplate(templateStr): | 165 def MakeTemplate(templateStr): |
149 template = Template(templateStr) | 166 template = Template(templateStr) |
150 RegisterTemplateFunction(template,CanonToCpp) | 167 RegisterTemplateFunction(template,CanonToCpp) |
151 RegisterTemplateFunction(template,CanonToTs) | 168 RegisterTemplateFunction(template,CanonToTs) |
152 RegisterTemplateFunction(template,NeedsConstruction) | 169 RegisterTemplateFunction(template,NeedsTsConstruction) |
170 RegisterTemplateFunction(template,NeedsCppConstruction) | |
153 return template | 171 return template |
154 | 172 |
155 def MakeTemplateFromFile(templateFileName): | 173 def MakeTemplateFromFile(templateFileName): |
156 templateFile = open(templateFileName, "r") | 174 templateFile = open(templateFileName, "r") |
157 templateFileContents = templateFile.read() | 175 templateFileContents = templateFile.read() |
474 only, 1 == some verbosity, 2 == nerd | 492 only, 1 == some verbosity, 2 == nerd |
475 mode""", | 493 mode""", |
476 ) | 494 ) |
477 | 495 |
478 args = parser.parse_args() | 496 args = parser.parse_args() |
479 inputSchemaFilename = args.input_schema | 497 schemaFile = args.input_schema |
480 outDir = args.out_dir | 498 outDir = args.out_dir |
481 | 499 |
482 schema: Dict = LoadSchema(inputSchemaFilename) | 500 tdico: Dict = GetTemplatingDictFromSchemaFilename(schemaFile) |
483 genOrder: List[str] = ComputeRequiredDeclarationOrder(schema) | 501 |
484 processedSchema: Dict = ProcessSchema(schema,genOrder) | 502 tsTemplateFile = \ |
503 os.path.join(os.path.dirname(__file__), 'template.in.ts') | |
504 template = MakeTemplateFromFile(tsTemplateFile) | |
505 renderedTsCode: str = template.render(**tdico) | |
506 outputTsFile = os.path.join( \ | |
507 outDir,f"{tdico['rootName']}_generated.ts") | |
508 with open(outputTsFile,"wt",encoding='utf8') as outFile: | |
509 outFile.write(renderedTsCode) | |
510 | |
511 cppTemplateFile = \ | |
512 os.path.join(os.path.dirname(__file__), 'template.in.h') | |
513 template = MakeTemplateFromFile(cppTemplateFile) | |
514 renderedCppCode: str = template.render(**tdico) | |
515 outputCppFile = os.path.join( \ | |
516 outDir,f"{tdico['rootName']}_generated.hpp") | |
517 with open(outputCppFile,"wt",encoding='utf8') as outFile: | |
518 outFile.write(renderedCppCode) | |
485 | 519 |
486 | 520 |
487 # def GenEnumDecl(genc: GenCode, fullName: str, schema: Dict) -> None: | 521 # def GenEnumDecl(genc: GenCode, fullName: str, schema: Dict) -> None: |
488 # """Writes the enumerations in genc""" | 522 # """Writes the enumerations in genc""" |
489 # enumDict:Dict=schema[fullName] | 523 # enumDict:Dict=schema[fullName] |