@@ -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
149155class 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
444462template <typename T>
445463auto 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