annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
471
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
1 import json
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
2 import yaml
471
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
3 import re
494
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
4 import os
473
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
5 import sys
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
6 from jinja2 import Template
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
7 from typing import (
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
8 Any,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
9 Dict,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
10 Generator,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
11 Iterable,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
12 Iterator,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
13 List,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
14 Match,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
15 Optional,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
16 Tuple,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
17 Union,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
18 cast,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
19 )
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
20 from io import StringIO
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
21 import time
469
52549faf47ba Ongoing code generation work
bgo-osimis
parents: 468
diff changeset
22
472
3db3289e1c25 Ongoing codegen work
bgo-osimis
parents: 471
diff changeset
23 """
3db3289e1c25 Ongoing codegen work
bgo-osimis
parents: 471
diff changeset
24 1 2 3 4 5 6 7
3db3289e1c25 Ongoing codegen work
bgo-osimis
parents: 471
diff changeset
25 12345678901234567890123456789012345678901234567890123456789012345678901234567890
3db3289e1c25 Ongoing codegen work
bgo-osimis
parents: 471
diff changeset
26 """
3db3289e1c25 Ongoing codegen work
bgo-osimis
parents: 471
diff changeset
27
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
28 # see https://stackoverflow.com/a/2504457/2927708
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
29 def trim(docstring):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
30 if not docstring:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
31 return ''
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
32 # Convert tabs to spaces (following the normal Python rules)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
33 # and split into a list of lines:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
34 lines = docstring.expandtabs().splitlines()
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
35 # Determine minimum indentation (first line doesn't count):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
36 indent = sys.maxsize
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
37 for line in lines[1:]:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
38 stripped = line.lstrip()
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
39 if stripped:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
40 indent = min(indent, len(line) - len(stripped))
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
41 # Remove indentation (first line is special):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
42 trimmed = [lines[0].strip()]
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
43 if indent < sys.maxsize:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
44 for line in lines[1:]:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
45 trimmed.append(line[indent:].rstrip())
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
46 # Strip off trailing and leading blank lines:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
47 while trimmed and not trimmed[-1]:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
48 trimmed.pop()
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
49 while trimmed and not trimmed[0]:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
50 trimmed.pop(0)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
51 # Return a single string:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
52 return '\n'.join(trimmed)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
53
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
54
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
55 class GenCode:
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
56 def __init__(self):
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
57
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
58 # file-wide preamble (#include directives, comment...)
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
59 self.cppPreamble = StringIO()
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
60
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
61 self.cppEnums = StringIO()
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
62 self.cppStructs = StringIO()
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
63 self.cppDispatcher = StringIO()
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
64 self.cppHandler = StringIO()
473
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
65
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
66 # file-wide preamble (module directives, comment...)
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
67 self.tsPreamble = StringIO()
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
68
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
69 self.tsEnums = StringIO()
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
70 self.tsStructs = StringIO()
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
71 self.tsDispatcher = StringIO()
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
72 self.tsHandler = StringIO()
486
8e40355a172b Unit tests OK for preambles, enums and structs in both TS and C++
bgo-osimis
parents: 485
diff changeset
73
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
74 def FlattenToFiles(self, outputDir: str):
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
75 raise NotImplementedError()
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
76
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
77
473
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
78 class JsonHelpers:
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
79 """A set of utilities to perform JSON operations"""
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
80
473
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
81 @staticmethod
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
82 def removeCommentsFromJsonContent(string):
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
83 """
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
84 Remove comments from a JSON file
473
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
85
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
86 Comments are not allowed in JSON but, i.e., Orthanc configuration files
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
87 contains C++ like comments that we need to remove before python can
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
88 parse the file
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
89 """
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
90 # remove all occurrence streamed comments (/*COMMENT */) from string
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
91 string = re.sub(re.compile("/\*.*?\*/", re.DOTALL), "", string)
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
92
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
93 # remove all occurrence singleline comments (//COMMENT\n ) from string
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
94 string = re.sub(re.compile("//.*?\n"), "", string)
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
95
473
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
96 return string
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
97
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
98 @staticmethod
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
99 def loadJsonWithComments(path):
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
100 """
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
101 Reads a JSON file that may contain C++ like comments
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
102 """
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
103 with open(path, "r") as fp:
473
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
104 fileContent = fp.read()
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
105 fileContent = JsonHelpers.removeCommentsFromJsonContent(fileContent)
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
106 return json.loads(fileContent)
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
107
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
108
490
6470248790db ongoing codegen work
bgo-osimis
parents: 489
diff changeset
109 def LoadSchemaFromJson(filePath: str):
473
628941d63b8c Ongoing work. Parsing tests work
bgo-osimis
parents: 472
diff changeset
110 return JsonHelpers.loadJsonWithComments(filePath)
469
52549faf47ba Ongoing code generation work
bgo-osimis
parents: 468
diff changeset
111
493
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
112 def CanonToCpp(canonicalTypename: str) -> str:
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
113 # C++: prefix map vector and string with std::map, std::vector and
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
114 # std::string
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
115 # replace int32 by int32_t
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
116 # replace float32 by float
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
117 # replace float64 by double
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
118 retVal: str = canonicalTypename
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
119 retVal = retVal.replace("map", "std::map")
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
120 retVal = retVal.replace("vector", "std::vector")
494
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
121 retVal = retVal.replace("string", "std::string")
493
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
122 retVal = retVal.replace("int32", "int32_t")
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
123 retVal = retVal.replace("float32", "float")
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
124 retVal = retVal.replace("float64", "double")
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
125 return retVal
470
db093eb6b29d Ongoing code generation tool
bgo-osimis
parents: 469
diff changeset
126
493
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
127 def CanonToTs(canonicalTypename: str) -> str:
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
128 # TS: replace vector with Array and map with Map
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
129 # string remains string
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
130 # replace int32 by number
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
131 # replace float32 by number
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
132 # replace float64 by number
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
133 retVal: str = canonicalTypename
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
134 retVal = retVal.replace("map", "Map")
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
135 retVal = retVal.replace("vector", "Array")
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
136 retVal = retVal.replace("int32", "number")
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
137 retVal = retVal.replace("float32", "number")
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
138 retVal = retVal.replace("float64", "number")
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
139 retVal = retVal.replace("bool", "boolean")
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
140 return retVal
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
141
494
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
142 def NeedsTsConstruction(enums: Dict, tsType: str):
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
143 if tsType == 'boolean':
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
144 return False
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
145 elif tsType == 'number':
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
146 return False
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
147 elif tsType == 'string':
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
148 return False
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
149 else:
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
150 enumNames = []
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
151 for enum in enums:
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
152 enumNames.append(enum['name'])
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
153 if tsType in enumNames:
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
154 return False
493
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
155 return True
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
156
494
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
157 def NeedsCppConstruction(canonTypename):
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
158 return False
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
159
493
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
160 def RegisterTemplateFunction(template,func):
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
161 """Makes a function callable by a jinja2 template"""
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
162 template.globals[func.__name__] = func
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
163 return func
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
164
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
165 def MakeTemplate(templateStr):
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
166 template = Template(templateStr)
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
167 RegisterTemplateFunction(template,CanonToCpp)
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
168 RegisterTemplateFunction(template,CanonToTs)
494
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
169 RegisterTemplateFunction(template,NeedsTsConstruction)
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
170 RegisterTemplateFunction(template,NeedsCppConstruction)
493
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
171 return template
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
172
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
173 def MakeTemplateFromFile(templateFileName):
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
174 templateFile = open(templateFileName, "r")
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
175 templateFileContents = templateFile.read()
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
176 return MakeTemplate(templateFileContents)
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
177 templateFile.close()
469
52549faf47ba Ongoing code generation work
bgo-osimis
parents: 468
diff changeset
178
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
179 def EatToken(sentence: str) -> Tuple[str, str]:
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
180 """splits "A,B,C" into "A" and "B,C" where A, B and C are type names
471
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
181 (including templates) like "int32", "TotoTutu", or
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
182 "map<map<int32,vector<string>>,map<string,int32>>" """
472
3db3289e1c25 Ongoing codegen work
bgo-osimis
parents: 471
diff changeset
183
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
184 if sentence.count("<") != sentence.count(">"):
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
185 raise Exception(
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
186 f"Error in the partial template type list {sentence}."
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
187 + " The number of < and > do not match!"
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
188 )
471
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
189
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
190 # the template level we're currently in
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
191 templateLevel = 0
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
192 for i in range(len(sentence)):
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
193 if (sentence[i] == ",") and (templateLevel == 0):
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
194 return (sentence[0:i], sentence[i + 1 :])
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
195 elif sentence[i] == "<":
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
196 templateLevel += 1
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
197 elif sentence[i] == ">":
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
198 templateLevel -= 1
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
199 return (sentence, "")
471
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
200
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
201
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
202 def SplitListOfTypes(typename: str) -> List[str]:
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
203 """Splits something like
471
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
204 vector<string>,int32,map<string,map<string,int32>>
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
205 in:
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
206 - vector<string>
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
207 - int32
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
208 map<string,map<string,int32>>
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
209
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
210 This is not possible with a regex so
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
211 """
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
212 stillStuffToEat: bool = True
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
213 tokenList = []
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
214 restOfString = typename
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
215 while stillStuffToEat:
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
216 firstToken, restOfString = EatToken(restOfString)
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
217 tokenList.append(firstToken)
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
218 if restOfString == "":
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
219 stillStuffToEat = False
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
220 return tokenList
471
125c19b294e3 Ongoing codegen work
bgo-osimis
parents: 470
diff changeset
221
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
222
490
6470248790db ongoing codegen work
bgo-osimis
parents: 489
diff changeset
223 templateRegex = \
6470248790db ongoing codegen work
bgo-osimis
parents: 489
diff changeset
224 re.compile(r"([a-zA-Z0-9_]*[a-zA-Z0-9_]*)<([a-zA-Z0-9_,:<>]+)>")
472
3db3289e1c25 Ongoing codegen work
bgo-osimis
parents: 471
diff changeset
225
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
226
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
227 def ParseTemplateType(typename) -> Tuple[bool, str, List[str]]:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
228 """ If the type is a template like "SOMETHING<SOME<THING,EL<SE>>>",
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
229 then it returns (true,"SOMETHING","SOME<THING,EL<SE>>")
470
db093eb6b29d Ongoing code generation tool
bgo-osimis
parents: 469
diff changeset
230 otherwise it returns (false,"","")"""
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
231
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
232 # let's remove all whitespace from the type
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
233 # split without argument uses any whitespace string as separator
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
234 # (space, tab, newline, return or formfeed)
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
235 typename = "".join(typename.split())
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
236 matches = templateRegex.match(typename)
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
237 if matches == None:
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
238 return (False, "", [])
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
239 else:
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
240 m = cast(Match[str], matches)
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
241 assert len(m.groups()) == 2
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
242 # we need to split with the commas that are outside of the
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
243 # defined types. Simply splitting at commas won't work
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
244 listOfDependentTypes = SplitListOfTypes(m.group(2))
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
245 return (True, m.group(1), listOfDependentTypes)
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
246
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
247
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
248 def ComputeOrderFromTypeTree(
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
249 ancestors: List[str],
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
250 genOrder: List[str],
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
251 shortTypename: str, schema: Dict[str, Dict]) -> None:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
252
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
253 if shortTypename in ancestors:
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
254 raise Exception(
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
255 f"Cyclic dependency chain found: the last of {ancestors} "
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
256 + f"depends on {shortTypename} that is already in the list."
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
257 )
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
258
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
259 if not (shortTypename in genOrder):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
260 (isTemplate, _, dependentTypenames) = ParseTemplateType(shortTypename)
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
261 if isTemplate:
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
262 # if it is a template, it HAS dependent types... They can be
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
263 # anything (primitive, collection, enum, structs..).
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
264 # Let's process them!
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
265 for dependentTypename in dependentTypenames:
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
266 # childAncestors = ancestors.copy() NO TEMPLATE ANCESTOR!!!
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
267 # childAncestors.append(typename)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
268 ComputeOrderFromTypeTree(
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
269 ancestors, genOrder, dependentTypename, schema
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
270 )
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
271 else:
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
272 # If it is not template, we are only interested if it is a
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
273 # dependency that we must take into account in the dep graph,
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
274 # i.e., a struct.
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
275 if IsShortStructType(shortTypename, schema):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
276 struct:Dict = schema[GetLongTypename(shortTypename, schema)]
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
277 # The keys in the struct dict are the member names
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
278 # The values in the struct dict are the member types
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
279 for field in struct.keys():
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
280 # we fill the chain of dependent types (starting here)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
281 ancestors.append(shortTypename)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
282 ComputeOrderFromTypeTree(
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
283 ancestors, genOrder, struct[field], schema)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
284 # don't forget to restore it!
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
285 ancestors.pop()
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
286
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
287 # now we're pretty sure our dependencies have been processed,
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
288 # we can start marking our code for generation (it might
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
289 # already have been done if someone referenced us earlier)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
290 if not shortTypename in genOrder:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
291 genOrder.append(shortTypename)
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
292
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
293 # +-----------------------+
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
294 # | Utility functions |
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
295 # +-----------------------+
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
296
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
297 def IsShortStructType(typename: str, schema: Dict[str, Dict]) -> bool:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
298 fullStructName = "struct " + typename
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
299 return (fullStructName in schema)
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
300
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
301 def GetLongTypename(shortTypename: str, schema: Dict):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
302 if shortTypename.startswith("enum "):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
303 raise RuntimeError('shortTypename.startswith("enum "):')
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
304 enumName: str = "enum " + shortTypename
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
305 isEnum = enumName in schema
490
6470248790db ongoing codegen work
bgo-osimis
parents: 489
diff changeset
306
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
307 if shortTypename.startswith("struct "):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
308 raise RuntimeError('shortTypename.startswith("struct "):')
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
309 structName: str = "struct " + shortTypename
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
310 isStruct = ("struct " + shortTypename) in schema
474
38997ceb9bc6 Ongoing work on message code generation
bgo-osimis
parents: 473
diff changeset
311
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
312 if isEnum and isStruct:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
313 raise RuntimeError('Enums and structs cannot have the same name')
474
38997ceb9bc6 Ongoing work on message code generation
bgo-osimis
parents: 473
diff changeset
314
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
315 if isEnum:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
316 return enumName
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
317 if isStruct:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
318 return structName
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
319
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
320 def IsTypename(fullName: str) -> bool:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
321 return (fullName.startswith("enum ") or fullName.startswith("struct "))
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
322
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
323 def IsEnumType(fullName: str) -> bool:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
324 return fullName.startswith("enum ")
490
6470248790db ongoing codegen work
bgo-osimis
parents: 489
diff changeset
325
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
326 def IsStructType(fullName: str) -> bool:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
327 return fullName.startswith("struct ")
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
328
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
329 def GetShortTypename(fullTypename: str) -> str:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
330 if fullTypename.startswith("struct "):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
331 return fullTypename[7:]
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
332 elif fullTypename.startswith("enum"):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
333 return fullTypename[5:]
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
334 else:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
335 raise RuntimeError \
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
336 ('fullTypename should start with either "struct " or "enum "')
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
337
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
338 def CheckSchemaSchema(schema: Dict) -> None:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
339 if not "rootName" in schema:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
340 raise Exception("schema lacks the 'rootName' key")
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
341 for name in schema.keys():
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
342 if (not IsEnumType(name)) and (not IsStructType(name)) and \
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
343 (name != 'rootName'):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
344 raise RuntimeError \
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
345 (f'Type "{name}" should start with "enum " or "struct "')
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
346
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
347 # TODO: check enum fields are unique (in whole namespace)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
348 # TODO: check struct fields are unique (in each struct)
493
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
349 # TODO: check that in the source schema, there are spaces after each colon
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
350
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
351 # +-----------------------+
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
352 # | Main processing logic |
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
353 # +-----------------------+
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
354
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
355 def ComputeRequiredDeclarationOrder(schema: dict) -> List[str]:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
356 # sanity check
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
357 CheckSchemaSchema(schema)
474
38997ceb9bc6 Ongoing work on message code generation
bgo-osimis
parents: 473
diff changeset
358
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
359 # we traverse the type dependency graph and we fill a queue with
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
360 # the required struct types, in a bottom-up fashion, to compute
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
361 # the declaration order
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
362 # The genOrder list contains the struct full names in the order
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
363 # where they must be defined.
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
364 # We do not care about the enums here... They do not depend upon
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
365 # anything and we'll handle them, in their original declaration
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
366 # order, at the start
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
367 genOrder: List = []
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
368 for fullName in schema.keys():
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
369 if IsStructType(fullName):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
370 realName: str = GetShortTypename(fullName)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
371 ancestors: List[str] = []
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
372 ComputeOrderFromTypeTree(ancestors, genOrder, realName, schema)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
373 return genOrder
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
374
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
375 def ProcessSchema(schema: dict, genOrder: List[str]) -> Dict:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
376 # sanity check
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
377 CheckSchemaSchema(schema)
472
3db3289e1c25 Ongoing codegen work
bgo-osimis
parents: 471
diff changeset
378
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
379 # let's doctor the schema to clean it up a bit
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
380 # order DOES NOT matter for enums, even though it's a list
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
381 enums: List[Dict] = []
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
382 for fullName in schema.keys():
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
383 if IsEnumType(fullName):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
384 # convert "enum Toto" to "Toto"
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
385 typename:str = GetShortTypename(fullName)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
386 enum = {}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
387 enum['name'] = typename
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
388 assert(type(schema[fullName]) == list)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
389 enum['fields'] = schema[fullName] # must be a list
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
390 enums.append(enum)
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
391
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
392 # now that the order has been established, we actually store\
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
393 # the structs in the correct order
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
394 # the structs are like:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
395 # example = [
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
396 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
397 # "name": "Message1",
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
398 # "fields": {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
399 # "someMember":"int32",
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
400 # "someOtherMember":"vector<string>"
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
401 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
402 # },
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
403 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
404 # "name": "Message2",
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
405 # "fields": {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
406 # "someMember":"int32",
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
407 # "someOtherMember22":"vector<Message1>"
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
408 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
409 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
410 # ]
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
411
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
412 structs: List[Dict] = []
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
413 for i in range(len(genOrder)):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
414 # this is already the short name
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
415 typename = genOrder[i]
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
416 fieldDict = schema["struct " + typename]
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
417 struct = {}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
418 struct['name'] = typename
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
419 struct['fields'] = fieldDict
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
420 structs.append(struct)
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
421
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
422 templatingDict = {}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
423 templatingDict['enums'] = enums
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
424 templatingDict['structs'] = structs
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
425 templatingDict['rootName'] = schema['rootName']
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
426
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
427 return templatingDict
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
428
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
429 # +-----------------------+
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
430 # | Write to files |
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
431 # +-----------------------+
474
38997ceb9bc6 Ongoing work on message code generation
bgo-osimis
parents: 473
diff changeset
432
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
433 # def WriteStreamsToFiles(rootName: str, genc: Dict[str, StringIO]) \
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
434 # -> None:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
435 # pass
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
436
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
437 def LoadSchema(fn):
493
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
438 # latin-1 is a trick, when we do NOT care about NON-ascii chars but
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
439 # we wish to avoid using a decoding error handler
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
440 # (see http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html#files-in-an-ascii-compatible-encoding-best-effort-is-acceptable)
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
441 # TL;DR: all 256 values are mapped to characters in latin-1 so the file
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
442 # contents never cause an error.
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
443 with open(fn, 'r', encoding='latin-1') as f:
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
444 schemaText = f.read()
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
445 assert(type(schemaText) == str)
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
446 # ensure there is a space after each colon. Otherwise, dicts could be
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
447 # erroneously recognized as an array of strings containing ':'
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
448 for i in range(len(schemaText)-1):
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
449 ch = schemaText[i]
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
450 nextCh = schemaText[i+1]
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
451 if ch == ':':
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
452 if not (nextCh == ' ' or nextCh == '\n'):
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
453 assert(False)
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
454 schema = yaml.load(schemaText)
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
455 return schema
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
456
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
457 def GetTemplatingDictFromSchemaFilename(fn):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
458 obj = LoadSchema(fn)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
459 genOrder: str = ComputeRequiredDeclarationOrder(obj)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
460 templatingDict = ProcessSchema(obj, genOrder)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
461 return templatingDict
470
db093eb6b29d Ongoing code generation tool
bgo-osimis
parents: 469
diff changeset
462
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
463 # +-----------------------+
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
464 # | ENTRY POINT |
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
465 # +-----------------------+
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
466
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
467 if __name__ == "__main__":
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
468 import argparse
468
cef55b4e6c21 stonegentool first commit
bgo-osimis
parents:
diff changeset
469
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
470 parser = argparse.ArgumentParser(
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
471 usage="""stonegentool.py [-h] [-o OUT_DIR] [-v] input_schema
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
472 EXAMPLE: python stonegentool.py -o "generated_files/" """
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
473 + """ "mainSchema.yaml,App Specific Commands.json" """
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
474 )
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
475 parser.add_argument("input_schema", type=str, \
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
476 help="path to the schema file")
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
477 parser.add_argument(
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
478 "-o",
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
479 "--out_dir",
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
480 type=str,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
481 default=".",
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
482 help="""path of the directory where the files
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
483 will be generated. Default is current
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
484 working folder""",
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
485 )
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
486 parser.add_argument(
489
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
487 "-v",
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
488 "--verbosity",
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
489 action="count",
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
490 default=0,
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
491 help="""increase output verbosity (0 == errors
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
492 only, 1 == some verbosity, 2 == nerd
f6b7f113cf27 Ongoing work on code generation
bgo-osimis
parents: 486
diff changeset
493 mode""",
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
494 )
468
cef55b4e6c21 stonegentool first commit
bgo-osimis
parents:
diff changeset
495
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
496 args = parser.parse_args()
494
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
497 schemaFile = args.input_schema
485
772516adcbf6 Ongoing work on code generation. Enums and structs OK in ts and cpp
bgo-osimis
parents: 482
diff changeset
498 outDir = args.out_dir
468
cef55b4e6c21 stonegentool first commit
bgo-osimis
parents:
diff changeset
499
494
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
500 tdico: Dict = GetTemplatingDictFromSchemaFilename(schemaFile)
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
501
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
502 tsTemplateFile = \
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
503 os.path.join(os.path.dirname(__file__), 'template.in.ts')
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
504 template = MakeTemplateFromFile(tsTemplateFile)
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
505 renderedTsCode: str = template.render(**tdico)
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
506 outputTsFile = os.path.join( \
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
507 outDir,f"{tdico['rootName']}_generated.ts")
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
508 with open(outputTsFile,"wt",encoding='utf8') as outFile:
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
509 outFile.write(renderedTsCode)
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
510
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
511 cppTemplateFile = \
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
512 os.path.join(os.path.dirname(__file__), 'template.in.h')
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
513 template = MakeTemplateFromFile(cppTemplateFile)
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
514 renderedCppCode: str = template.render(**tdico)
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
515 outputCppFile = os.path.join( \
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
516 outDir,f"{tdico['rootName']}_generated.hpp")
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
517 with open(outputCppFile,"wt",encoding='utf8') as outFile:
fc17251477d6 TS and CPP tests OK. Ongoing code for C++ program that reads list of serialized messages in N files. Requires conan
bgo-osimis
parents: 493
diff changeset
518 outFile.write(renderedCppCode)
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
519
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
520
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
521 # def GenEnumDecl(genc: GenCode, fullName: str, schema: Dict) -> None:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
522 # """Writes the enumerations in genc"""
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
523 # enumDict:Dict=schema[fullName]
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
524 # # jinja2 template
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
525 # j2cppEnum = Template(trim(
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
526 # """ {{fullName}}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
527 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
528 # {% for key in enumDict.keys()%}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
529 # {{key}},
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
530 # {%endfor%}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
531 # };
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
532 # """))
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
533 # j2cppEnumR = j2cppEnum.render(locals())
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
534 # genc.cppEnums.write(j2cppEnumR)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
535
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
536 # j2tsEnum = Template(trim(
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
537 # """ export {{fullName}}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
538 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
539 # {% for key in enumDict.keys()%}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
540 # {{key}},
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
541 # {%endfor%}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
542 # };
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
543 # """))
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
544 # j2cppEnumR = j2cppEnum.render(locals())
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
545 # genc.tsEnums.write(j2cppEnumR)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
546
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
547
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
548
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
549 # def GetSerializationCode(typename: str,valueName: str, tempName: str)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
550 # if IsPrimitiveType(typename) or IsTemplateCollection(typename):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
551 # # no need to write code for the primitive types or collections.
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
552 # # It is handled in C++ by the template functions and in TS by
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
553 # # the JSON.stringify code.
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
554 # elif IsStructType(typename):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
555 # pass
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
556
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
557 # def GenStructTypeDeclAndSerialize(genc: GenCode, type, schema) -> None:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
558 # ######
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
559 # # CPP
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
560 # ######
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
561 # sampleCpp = """ struct Message1
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
562 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
563 # int32_t a;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
564 # std::string b;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
565 # EnumMonth0 c;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
566 # bool d;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
567 # };
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
568
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
569 # Json::Value StoneSerialize(const Message1& value)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
570 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
571 # Json::Value result(Json::objectValue);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
572 # result["a"] = StoneSerialize(value.a);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
573 # result["b"] = StoneSerialize(value.b);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
574 # result["c"] = StoneSerialize(value.c);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
575 # result["d"] = StoneSerialize(value.d);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
576 # return result;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
577 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
578 # """
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
579
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
580
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
581 # ######
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
582 # # TS
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
583 # ######
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
584 # sampleTs = """
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
585 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
586 # export class Message1 {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
587 # a: number;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
588 # b: string;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
589 # c: EnumMonth0;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
590 # d: boolean;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
591 # public StoneSerialize(): string {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
592 # let container: object = {};
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
593 # container['type'] = 'Message1';
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
594 # container['value'] = this;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
595 # return JSON.stringify(container);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
596 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
597 # };
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
598 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
599 # """
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
600
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
601
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
602
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
603
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
604 # tsText: StringIO = StringIO()
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
605 # cppText: StringIO = StringIO()
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
606
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
607 # tsText.write("class %s\n" % typeDict["name"])
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
608 # tsText.write("{\n")
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
609
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
610 # cppText.write("struct %s\n" % typeDict["name"])
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
611 # cppText.write("{\n")
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
612
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
613 # """
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
614
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
615 # GenerateSerializationCode(typename,valueName)
482
f58fe38c8c04 Ongoing work on codegen: ts and cpp enum and struct writing seem to be OK. No file write yet
bgo-osimis
parents: 474
diff changeset
616
491
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
617 # primitives:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
618 # -----------
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
619 # int
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
620 # jsonValue val(objectInt);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
621 # val.setValue("$name")
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
622 # parent.add(("$name",$name)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
623 # double
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
624 # ...
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
625 # string
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
626 # ...
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
627
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
628 # collections:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
629 # -----------
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
630 # dict { }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
631
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
632 # serializeValue()
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
633 # """
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
634
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
635 # for i in range(len(typeDict["fields"])):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
636 # field = typeDict["fields"][i]
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
637 # name = field["name"]
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
638 # tsType = GetTypeScriptTypenameFromCanonical(field["type"])
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
639 # tsText.write(" public %s %s;\n" % (tsType, name))
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
640 # cppType = GetCppTypenameFromCanonical(field["type"])
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
641 # cppText.write(" %s %s;\n" % (cppType, name))
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
642
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
643 # tsText.write("};\n\n")
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
644 # cppText.write("};\n\n")
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
645
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
646 # genc.tsStructs.write(tsText.getvalue())
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
647 # genc.cppStructs.write(cppText.getvalue())
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
648
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
649
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
650 # def GenerateCodeFromTsTemplate(genc)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
651
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
652
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
653 # +-----------------------+
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
654 # | CODE GENERATION |
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
655 # +-----------------------+
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
656
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
657 # def GenPreambles(rootName: str, genc: GenCode) -> None:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
658 # cppPreambleT = Template(trim(
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
659 # """// autogenerated by stonegentool on {{time.ctime()}}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
660 # // for module {{rootName}}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
661 # #include <cstdint>
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
662 # #include <string>
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
663 # #include <vector>
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
664 # #include <map>
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
665 # namespace {{rootName}}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
666 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
667 # Json::Value StoneSerialize(int32_t value)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
668 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
669 # Json::Value result(value);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
670 # return result;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
671 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
672 # Json::Value StoneSerialize(double value)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
673 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
674 # Json::Value result(value);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
675 # return result;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
676 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
677 # Json::Value StoneSerialize(bool value)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
678 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
679 # Json::Value result(value);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
680 # return result;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
681 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
682 # Json::Value StoneSerialize(const std::string& value)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
683 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
684 # // the following is better than
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
685 # Json::Value result(value.data(),value.data()+value.size());
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
686 # return result;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
687 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
688 # template<typename T>
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
689 # Json::Value StoneSerialize(const std::map<std::string,T>& value)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
690 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
691 # Json::Value result(Json::objectValue);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
692
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
693 # for (std::map<std::string, T>::const_iterator it = value.cbegin();
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
694 # it != value.cend(); ++it)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
695 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
696 # // it->first it->second
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
697 # result[it->first] = StoneSerialize(it->second);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
698 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
699 # return result;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
700 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
701 # template<typename T>
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
702 # Json::Value StoneSerialize(const std::vector<T>& value)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
703 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
704 # Json::Value result(Json::arrayValue);
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
705 # for (size_t i = 0; i < value.size(); ++i)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
706 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
707 # result.append(StoneSerialize(value[i]));
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
708 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
709 # return result;
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
710 # }
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
711 # """
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
712 # cppPreambleR = cppPreambleT.render(locals())
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
713 # genc.cppPreamble.write(cppPreambleR)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
714
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
715 # tsPreambleT = Template(trim(
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
716 # """// autogenerated by stonegentool on {{time.ctime()}}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
717 # // for module {{rootName}}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
718
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
719 # namespace {{rootName}}
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
720 # {
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
721 # """
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
722 # tsPreambleR = tsPreambleT.render(locals())
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
723 # genc.tsPreamble.write(tsPreambleR)
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
724
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
725 # def ComputeOrder_ProcessStruct( \
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
726 # genOrder: List[str], name:str, schema: Dict[str, str]) -> None:
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
727 # # let's generate the code according to the
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
728 # struct = schema[name]
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
729
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
730 # if not IsStructType(name):
8e7e151ef472 Unit tests pass for enum generation
bgo-osimis
parents: 490
diff changeset
731 # raise Exception(f'{typename} should start with "struct "')
493
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
732
6fbf2eae7c88 All unit tests pass for generation, including handler and dispatcher
bgo-osimis
parents: 491
diff changeset
733