message_definition_cache.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 #include <set>
4 #include <string>
5 #include <unordered_map>
6 #include <unordered_set>
7 #include <utility>
8 
9 namespace foxglove {
10 
11 // Taken from
12 // https://github.com/ros2/rosidl/blob/a57baea5/rosidl_parser/rosidl_parser/definition.py
13 constexpr char SERVICE_REQUEST_MESSAGE_SUFFIX[] = "_Request";
14 constexpr char SERVICE_RESPONSE_MESSAGE_SUFFIX[] = "_Response";
15 constexpr char ACTION_GOAL_SERVICE_SUFFIX[] = "_SendGoal";
16 constexpr char ACTION_RESULT_SERVICE_SUFFIX[] = "_GetResult";
17 constexpr char ACTION_FEEDBACK_MESSAGE_SUFFIX[] = "_FeedbackMessage";
18 
20  IDL,
21  MSG,
22 };
23 
24 struct MessageSpec {
25  MessageSpec(MessageDefinitionFormat format, std::string text, const std::string& package_context);
26  const std::set<std::string> dependencies;
27  const std::string text;
29 };
30 
33  std::string package_resource_name;
34 
35  bool operator==(const DefinitionIdentifier& di) const {
36  return (format == di.format) && (package_resource_name == di.package_resource_name);
37  }
38 };
39 
40 class DefinitionNotFoundError : public std::exception {
41 private:
42  std::string name_;
43 
44 public:
45  explicit DefinitionNotFoundError(std::string name)
46  : name_(std::move(name)) {}
47 
48  const char* what() const noexcept override {
49  return name_.c_str();
50  }
51 };
52 
54 public:
63  std::pair<MessageDefinitionFormat, std::string> get_full_text(
64  const std::string& package_resource_name);
65 
66 private:
68  std::size_t operator()(const DefinitionIdentifier& di) const {
69  std::size_t h1 = std::hash<MessageDefinitionFormat>()(di.format);
70  std::size_t h2 = std::hash<std::string>()(di.package_resource_name);
71  return h1 ^ h2;
72  }
73  };
78  const MessageSpec& load_message_spec(const DefinitionIdentifier& definition_identifier);
79 
80  std::unordered_map<DefinitionIdentifier, MessageSpec, DefinitionIdentifierHash>
82 };
83 
84 std::set<std::string> parse_dependencies(MessageDefinitionFormat format, const std::string& text,
85  const std::string& package_context);
86 
87 } // namespace foxglove
foxglove::DefinitionNotFoundError::DefinitionNotFoundError
DefinitionNotFoundError(std::string name)
Definition: message_definition_cache.hpp:45
foxglove::MessageDefinitionFormat::IDL
@ IDL
foxglove
Definition: base64.hpp:8
foxglove::DefinitionIdentifier::package_resource_name
std::string package_resource_name
Definition: message_definition_cache.hpp:33
format
Definition: format.py:1
foxglove::MessageDefinitionCache::DefinitionIdentifierHash
Definition: message_definition_cache.hpp:67
foxglove::MessageSpec::MessageSpec
MessageSpec(MessageDefinitionFormat format, std::string text, const std::string &package_context)
Definition: message_definition_cache.cpp:178
foxglove::MessageDefinitionFormat
MessageDefinitionFormat
Definition: message_definition_cache.hpp:19
foxglove::MessageDefinitionCache::load_message_spec
const MessageSpec & load_message_spec(const DefinitionIdentifier &definition_identifier)
Definition: message_definition_cache.cpp:184
foxglove::SERVICE_RESPONSE_MESSAGE_SUFFIX
constexpr char SERVICE_RESPONSE_MESSAGE_SUFFIX[]
Definition: message_definition_cache.hpp:14
foxglove::parse_dependencies
std::set< std::string > parse_dependencies(MessageDefinitionFormat format, const std::string &text, const std::string &package_context)
Definition: message_definition_cache.cpp:72
foxglove::MessageSpec
Definition: message_definition_cache.hpp:24
foxglove::DefinitionNotFoundError
Definition: message_definition_cache.hpp:40
foxglove::MessageDefinitionCache
Definition: message_definition_cache.hpp:53
foxglove::SERVICE_REQUEST_MESSAGE_SUFFIX
constexpr char SERVICE_REQUEST_MESSAGE_SUFFIX[]
Definition: message_definition_cache.hpp:13
foxglove::MessageDefinitionFormat::MSG
@ MSG
foxglove::DefinitionIdentifier::format
MessageDefinitionFormat format
Definition: message_definition_cache.hpp:32
foxglove::MessageDefinitionCache::msg_specs_by_definition_identifier_
std::unordered_map< DefinitionIdentifier, MessageSpec, DefinitionIdentifierHash > msg_specs_by_definition_identifier_
Definition: message_definition_cache.hpp:81
foxglove::DefinitionNotFoundError::what
const char * what() const noexcept override
Definition: message_definition_cache.hpp:48
foxglove::ACTION_GOAL_SERVICE_SUFFIX
constexpr char ACTION_GOAL_SERVICE_SUFFIX[]
Definition: message_definition_cache.hpp:15
foxglove::MessageSpec::format
MessageDefinitionFormat format
Definition: message_definition_cache.hpp:28
foxglove::DefinitionIdentifier::operator==
bool operator==(const DefinitionIdentifier &di) const
Definition: message_definition_cache.hpp:35
foxglove::MessageDefinitionCache::DefinitionIdentifierHash::operator()
std::size_t operator()(const DefinitionIdentifier &di) const
Definition: message_definition_cache.hpp:68
std
foxglove::ACTION_FEEDBACK_MESSAGE_SUFFIX
constexpr char ACTION_FEEDBACK_MESSAGE_SUFFIX[]
Definition: message_definition_cache.hpp:17
foxglove::DefinitionIdentifier
Definition: message_definition_cache.hpp:31
foxglove::ACTION_RESULT_SERVICE_SUFFIX
constexpr char ACTION_RESULT_SERVICE_SUFFIX[]
Definition: message_definition_cache.hpp:16
foxglove::MessageSpec::dependencies
const std::set< std::string > dependencies
Definition: message_definition_cache.hpp:26
foxglove::DefinitionNotFoundError::name_
std::string name_
Definition: message_definition_cache.hpp:42
foxglove::MessageDefinitionCache::get_full_text
std::pair< MessageDefinitionFormat, std::string > get_full_text(const std::string &package_resource_name)
Definition: message_definition_cache.cpp:342
foxglove::MessageSpec::text
const std::string text
Definition: message_definition_cache.hpp:27


foxglove_bridge
Author(s): Foxglove
autogenerated on Tue May 20 2025 02:34:26