34 json[
"tree"] = {{
"behavior_tree_element",
tree_config_.behavior_tree_element},
36 {
"allow_multiple_trees",
tree_config_.allow_multiple_trees},
38 {
"subtree_reference_attribute",
tree_config_.subtree_reference_attribute},
39 {
"validate_tree_structure",
tree_config_.validate_tree_structure},
43 json[
"node"] = {{
"control_element",
node_config_.control_element},
47 {
"generic_node_element",
node_config_.generic_node_element},
49 {
"node_name_attribute",
node_config_.node_name_attribute},
50 {
"node_type_attribute",
node_config_.node_type_attribute},
51 {
"allow_custom_attributes",
node_config_.allow_custom_attributes}};
74 json[
"advanced"] = {{
"enable_progress_reporting",
advanced_config_.enable_progress_reporting},
90 if (json.contains(
"document")) {
91 const auto &doc = json[
"document"];
92 if (doc.contains(
"root_element"))
94 if (doc.contains(
"main_tree_attribute"))
96 if (doc.contains(
"case_sensitive"))
98 if (doc.contains(
"allow_unknown_elements"))
100 if (doc.contains(
"whitespace_handling")) {
103 if (doc.contains(
"naming_convention")) {
109 if (json.contains(
"tree")) {
110 const auto &tree = json[
"tree"];
111 if (tree.contains(
"behavior_tree_element"))
112 tree_config_.behavior_tree_element = tree[
"behavior_tree_element"];
113 if (tree.contains(
"tree_id_attribute"))
114 tree_config_.tree_id_attribute = tree[
"tree_id_attribute"];
115 if (tree.contains(
"allow_multiple_trees"))
116 tree_config_.allow_multiple_trees = tree[
"allow_multiple_trees"];
117 if (tree.contains(
"subtree_element"))
119 if (tree.contains(
"subtree_reference_attribute"))
120 tree_config_.subtree_reference_attribute = tree[
"subtree_reference_attribute"];
121 if (tree.contains(
"validate_tree_structure"))
122 tree_config_.validate_tree_structure = tree[
"validate_tree_structure"];
123 if (tree.contains(
"require_root_node"))
124 tree_config_.require_root_node = tree[
"require_root_node"];
128 if (json.contains(
"node")) {
129 const auto &node = json[
"node"];
130 if (node.contains(
"control_element"))
132 if (node.contains(
"action_element"))
134 if (node.contains(
"condition_element"))
135 node_config_.condition_element = node[
"condition_element"];
136 if (node.contains(
"decorator_element"))
137 node_config_.decorator_element = node[
"decorator_element"];
138 if (node.contains(
"generic_node_element"))
139 node_config_.generic_node_element = node[
"generic_node_element"];
140 if (node.contains(
"node_id_attribute"))
141 node_config_.node_id_attribute = node[
"node_id_attribute"];
142 if (node.contains(
"node_name_attribute"))
143 node_config_.node_name_attribute = node[
"node_name_attribute"];
144 if (node.contains(
"node_type_attribute"))
145 node_config_.node_type_attribute = node[
"node_type_attribute"];
146 if (node.contains(
"allow_custom_attributes"))
147 node_config_.allow_custom_attributes = node[
"allow_custom_attributes"];
151 if (json.contains(
"classification")) {
152 const auto &classification = json[
"classification"];
153 if (classification.contains(
"strategy")) {
156 if (classification.contains(
"control_types")) {
159 if (classification.contains(
"decorator_types")) {
162 if (classification.contains(
"action_types")) {
165 if (classification.contains(
"condition_types")) {
168 if (classification.contains(
"unknown_behavior")) {
172 if (classification.contains(
"type_attribute_name")) {
178 if (json.contains(
"blackboard")) {
179 const auto &blackboard = json[
"blackboard"];
180 if (blackboard.contains(
"blackboard_element"))
182 if (blackboard.contains(
"blackboard_id_attribute"))
184 if (blackboard.contains(
"parent_attribute"))
186 if (blackboard.contains(
"entry_element"))
188 if (blackboard.contains(
"entry_key_attribute"))
190 if (blackboard.contains(
"entry_type_attribute"))
192 if (blackboard.contains(
"entry_value_attribute"))
194 if (blackboard.contains(
"type_mappings")) {
195 blackboard_config_.type_mappings = blackboard[
"type_mappings"].get<std::map<String, String>>();
197 if (blackboard.contains(
"allow_undefined_keys"))
202 if (json.contains(
"advanced")) {
203 const auto &advanced = json[
"advanced"];
204 if (advanced.contains(
"enable_progress_reporting"))
205 advanced_config_.enable_progress_reporting = advanced[
"enable_progress_reporting"];
206 if (advanced.contains(
"detailed_error_messages"))
207 advanced_config_.detailed_error_messages = advanced[
"detailed_error_messages"];
208 if (advanced.contains(
"track_line_column"))
210 if (advanced.contains(
"subtree_expansion")) {
213 if (advanced.contains(
"max_recursion_depth"))
215 if (advanced.contains(
"xml_namespace_uri"))
217 if (advanced.contains(
"preserve_comments"))
219 if (advanced.contains(
"preserve_attribute_order"))
220 advanced_config_.preserve_attribute_order = advanced[
"preserve_attribute_order"];
221 if (advanced.contains(
"custom_validation_rules"))
222 advanced_config_.custom_validation_rules = advanced[
"custom_validation_rules"];
224 }
catch (
const std::exception &e) {
225 LOG_ERROR(
"ParserConfig",
"Error parsing JSON configuration: " + std::string(e.what()));
235 errors.push_back(
"Document root element cannot be empty");
240 errors.push_back(
"Behavior tree element cannot be empty");
243 errors.push_back(
"Tree ID attribute cannot be empty");
248 errors.push_back(
"Control element cannot be empty");
251 errors.push_back(
"Action element cannot be empty");
254 errors.push_back(
"Condition element cannot be empty");
257 errors.push_back(
"Decorator element cannot be empty");
260 errors.push_back(
"Node ID attribute cannot be empty");
265 errors.push_back(
"Control types list cannot be empty");
268 errors.push_back(
"Decorator types list cannot be empty");
273 errors.push_back(
"Blackboard element cannot be empty");
276 errors.push_back(
"Blackboard entry element cannot be empty");
281 errors.push_back(
"Maximum recursion depth must be positive");
284 return errors.empty();