Skip to content

Commit 77bc65a

Browse files
committed
feat: cpp, instead of creating list with ids it creates maps (if mapSubject available)
1 parent 419de6f commit 77bc65a

File tree

1 file changed

+28
-7
lines changed

1 file changed

+28
-7
lines changed

schema_salad/cpp_codegen.py

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -137,20 +137,27 @@ def writeImplDefinition(self, target: IO[str], fullInd: str, ind: str) -> None:
137137

138138
for field in self.fields:
139139
fieldname = safename(field.name)
140-
target.write(
141-
f'{fullInd}{ind}addYamlField(n, "{field.name}", toYaml(*{fieldname}));\n' # noqa: B907
142-
)
140+
if field.remap != "":
141+
target.write(
142+
f"""{fullInd}{ind}addYamlField(n, "{field.name}",
143+
convertListToMap(toYaml(*{fieldname}), "{field.remap}"));\n""" # noqa: B907
144+
)
145+
else:
146+
target.write(
147+
f'{fullInd}{ind}addYamlField(n, "{field.name}", toYaml(*{fieldname}));\n' # noqa: B907
148+
)
143149
# target.write(f"{fullInd}{ind}addYamlIfNotEmpty(n, \"{field.name}\", toYaml(*{fieldname}));\n")
144150

145151
target.write(f"{fullInd}{ind}return n;\n{fullInd}}}\n")
146152

147153

148154
# Prototype of a single field of a class
149155
class FieldDefinition:
150-
def __init__(self, name: str, typeStr: str, optional: bool):
156+
def __init__(self, name: str, typeStr: str, optional: bool, remap: str):
151157
self.name = name
152158
self.typeStr = typeStr
153159
self.optional = optional
160+
self.remap = remap
154161

155162
def writeDefinition(self, target: IO[Any], fullInd: str, ind: str, namespace: str) -> None:
156163
"""Write a C++ definition for the class field."""
@@ -440,6 +447,17 @@ def epilogue(self, root_loader: Optional[TypeDef]) -> None:
440447
}
441448
}
442449
450+
inline auto convertListToMap(YAML::Node list, std::string const& key_name) {
451+
if (list.size() == 0) return list;
452+
auto map = YAML::Node{};
453+
for (YAML::Node n : list) {
454+
auto key = n[key_name].as<std::string>();
455+
n.remove(key_name);
456+
map[key] = n;
457+
}
458+
return map;
459+
}
460+
443461
// fwd declaring toYaml
444462
template <typename T>
445463
auto toYaml(std::vector<T> const& v) -> YAML::Node;
@@ -516,7 +534,6 @@ class heap_object {
516534
if len(self.classDefinitions[key].specializationTypes) > 0:
517535
self.classDefinitions[key].extends = []
518536

519-
520537
# remove fields that are available in a parent class
521538
for key in self.classDefinitions:
522539
for field in self.classDefinitions[key].allfields:
@@ -533,7 +550,6 @@ class heap_object {
533550
if not found:
534551
self.classDefinitions[key].fields.append(field)
535552

536-
537553
for key in self.enumDefinitions:
538554
self.enumDefinitions[key].writeDefinition(self.target, " ")
539555
for key in self.classDefinitions:
@@ -572,6 +588,11 @@ class heap_object {
572588

573589
def parseRecordField(self, field: Dict[str, Any]) -> FieldDefinition:
574590
(namespace, classname, fieldname) = split_field(field["name"])
591+
remap = ""
592+
if "jsonldPredicate" in field:
593+
if "mapSubject" in field["jsonldPredicate"]:
594+
remap = field["jsonldPredicate"]["mapSubject"]
595+
575596
if isinstance(field["type"], dict):
576597
if field["type"]["type"] == "enum":
577598
fieldtype = "Enum"
@@ -582,7 +603,7 @@ def parseRecordField(self, field: Dict[str, Any]) -> FieldDefinition:
582603
fieldtype = field["type"]
583604
fieldtype = self.convertTypeToCpp(fieldtype)
584605

585-
return FieldDefinition(name=fieldname, typeStr=fieldtype, optional=False)
606+
return FieldDefinition(name=fieldname, typeStr=fieldtype, optional=False, remap=remap)
586607

587608
def parseRecordSchema(self, stype: Dict[str, Any]) -> None:
588609
cd = ClassDefinition(name=stype["name"])

0 commit comments

Comments
 (0)