24 if (encoded_str.empty()) {
25 throw exceptions::TreeBuildHandlerError(
"Entry point string must not be empty.");
29 const auto open_paren = encoded_str.find(
'(');
30 if (open_paren == std::string::npos) {
32 root_tree_name = encoded_str;
37 if (encoded_str.back() !=
')') {
38 throw exceptions::TreeBuildHandlerError(
39 "Invalid entry point format: missing closing parenthesis in '" + encoded_str +
"'.");
42 root_tree_name = encoded_str.substr(0, open_paren);
43 if (root_tree_name.empty()) {
44 throw exceptions::TreeBuildHandlerError(
45 "Invalid entry point format: tree name must not be empty in '" + encoded_str +
"'.");
49 const std::string params_str = encoded_str.substr(open_paren + 1, encoded_str.size() - open_paren - 2);
50 if (params_str.empty()) {
55 std::string::size_type pos = 0;
56 while (pos < params_str.size()) {
57 const auto comma = params_str.find(
',', pos);
58 const std::string token = params_str.substr(pos, comma - pos);
60 const auto eq = token.find(
'=');
61 if (eq == std::string::npos) {
62 throw exceptions::TreeBuildHandlerError(
63 "Invalid entry point format: expected 'key=value' but got '" + token +
"' in '" + encoded_str +
"'.");
66 const std::string key = token.substr(0, eq);
67 const std::string value = token.substr(eq + 1);
69 throw exceptions::TreeBuildHandlerError(
70 "Invalid entry point format: blackboard key must not be empty in '" + encoded_str +
"'.");
72 inital_blackboard[key] = value;
74 if (comma == std::string::npos) {
82 const std::string & name, rclcpp::Node::SharedPtr ros_node_ptr, NodeLoader::SharedPtr tree_node_loader_ptr)
83:
logger_(ros_node_ptr->get_logger().get_child(name)),
84 ros_node_wptr_(ros_node_ptr),
85 tree_node_loader_ptr(tree_node_loader_ptr)
TreeBasedEntryPoint()=default
Default constructor.