@@ -35,22 +35,9 @@ TESSERACT_COMMON_IGNORE_WARNINGS_POP
3535
3636namespace tesseract_common
3737{
38- /* *
39- * @brief Recursively processes a YAML node to resolve `!include` directives.
40- *
41- * This function replaces any node tagged with `!include` with the content of the
42- * specified file. It also recursively processes maps and sequences to handle nested
43- * `!include` directives.
44- *
45- * @param node The YAML node to process.
46- * @param locator The locator used to resolve urls and relative file paths.
47- * @return A YAML::Node with all `!include` directives resolved.
48- *
49- * @throws std::runtime_error if an `!include` tag is used improperly (e.g., not scalar),
50- * or if a file specified in an `!include` directive cannot be loaded.
51- */
52- YAML::Node processYamlIncludeDirective (const YAML::Node& node, const ResourceLocator& locator)
38+ void processYamlIncludeDirective (YAML::Node& node, const ResourceLocator& locator)
5339{
40+ // Case 1: this node *is* an include → replace it with the loaded file
5441 if (node.Tag () == " !include" )
5542 {
5643 // Ensure the node is scalar and contains a file path
@@ -63,44 +50,76 @@ YAML::Node processYamlIncludeDirective(const YAML::Node& node, const ResourceLoc
6350 if (resource == nullptr )
6451 throw std::runtime_error (" Unable to locate resource: " + included_file);
6552
66- return processYamlIncludeDirective (YAML::LoadFile (resource->getFilePath ()), *resource);
53+ // Parse once
54+ YAML::Node loaded = YAML::LoadFile (resource->getFilePath ());
55+
56+ // Take over this node
57+ node = loaded;
58+
59+ // Clear the old tag so we don't re‐process it
60+ node.SetTag (" " );
61+
62+ // Recurse into what we just loaded
63+ processYamlIncludeDirective (node, *resource);
64+ return ;
6765 }
6866
67+ // Case 2: map → mutate each value in‐place
6968 if (node.IsMap ())
7069 {
71- // Create a new map and process each key-value pair
72- YAML::Node processed_map = YAML::Node (YAML::NodeType::Map);
7370 for (auto it = node.begin (); it != node.end (); ++it)
74- processed_map[it->first ] = processYamlIncludeDirective (it->second , locator);
71+ {
72+ // 1) pull out the key
73+ const std::string key = it->first .Scalar ();
7574
76- return processed_map;
75+ // 2) copy the child handle (this is cheap)
76+ YAML::Node child = it->second ;
77+
78+ // 3) recurse & mutate the child
79+ processYamlIncludeDirective (child, locator);
80+
81+ // 4) write it back into the map
82+ node[key] = child;
83+ }
84+
85+ return ;
7786 }
7887
88+ // Case 3: sequence → mutate each element in‐place
7989 if (node.IsSequence ())
8090 {
81- // Create a new sequence and process each element
82- YAML::Node processed_sequence = YAML::Node (YAML::NodeType::Sequence);
83- for (const auto & child : node)
84- processed_sequence.push_back (processYamlIncludeDirective (child, locator));
91+ // NOLINTNEXTLINE(modernize-loop-convert)
92+ for (std::size_t i = 0 ; i < node.size (); ++i)
93+ {
94+ // 1) pull out the element (this is cheap—just a handle copy)
95+ YAML::Node child = node[i];
96+
97+ // 2) recurse & mutate that subtree
98+ processYamlIncludeDirective (child, locator);
99+
100+ // 3) write it back into the sequence
101+ node[i] = child;
102+ }
85103
86- return processed_sequence ;
104+ return ;
87105 }
88106
89- // Return the node as-is for scalars and unsupported types
90- return node;
107+ // Case 4: scalar or anything else → nothing to do
91108}
92109
93110YAML::Node loadYamlFile (const std::string& file_path, const ResourceLocator& locator)
94111{
95112 auto resource = locator.locateResource (file_path);
96113 YAML::Node root = YAML::LoadFile (resource->getFilePath ());
97- return processYamlIncludeDirective (root, *resource);
114+ processYamlIncludeDirective (root, *resource);
115+ return root;
98116}
99117
100118YAML::Node loadYamlString (const std::string& yaml_string, const ResourceLocator& locator)
101119{
102120 YAML::Node root = YAML::Load (yaml_string);
103- return processYamlIncludeDirective (root, locator);
121+ processYamlIncludeDirective (root, locator);
122+ return root;
104123}
105124
106125void writeYamlToFile (const YAML::Node& node, const std::string& file_path)
0 commit comments