summaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
authorMarcel Müller <m.mueller@ifm.com>2022-05-12 10:09:02 +0200
committerMarcel Müller <m.mueller@ifm.com>2022-05-31 09:38:05 +0200
commit02bfa3768be59b211daddd9b66203b787fd72153 (patch)
treeea4380d3bd1f3cef282d39402e3dd76ad9c2e080 /crates
parentd3df17fbca953c1cde1370fa7a9d184834d26296 (diff)
Add TypeUUID to Messages
This allows messages to be identified by their UUID. This means that messages are no longer identified by the internal TypeId as provided from rustc but our choosing. This allows for more powerful features along the line, such as external programs being able to specify messages at all. Signed-off-by: Marcel Müller <m.mueller@ifm.com>
Diffstat (limited to 'crates')
-rw-r--r--crates/core/tedge_api/Cargo.toml1
-rw-r--r--crates/core/tedge_api/README.md5
-rw-r--r--crates/core/tedge_api/examples/heartbeat.rs7
-rw-r--r--crates/core/tedge_api/examples/universal_log.rs7
-rw-r--r--crates/core/tedge_api/src/address.rs21
-rw-r--r--crates/core/tedge_api/src/lib.rs3
-rw-r--r--crates/core/tedge_api/src/message.rs20
-rw-r--r--crates/core/tedge_api/src/plugin.rs16
8 files changed, 58 insertions, 22 deletions
diff --git a/crates/core/tedge_api/Cargo.toml b/crates/core/tedge_api/Cargo.toml
index 5546ed2b..a4ff92ab 100644
--- a/crates/core/tedge_api/Cargo.toml
+++ b/crates/core/tedge_api/Cargo.toml
@@ -21,6 +21,7 @@ termimad = "0.20.1"
nu-ansi-term = "0.45.1"
tedge_config_derive = { version = "0.1.0", path = "tedge_config_derive" }
tracing = "0.1"
+type-uuid = "0.1.2"
[dev-dependencies]
pretty_assertions = "1.2.1"
diff --git a/crates/core/tedge_api/README.md b/crates/core/tedge_api/README.md
index 340faa23..8c59231a 100644
--- a/crates/core/tedge_api/README.md
+++ b/crates/core/tedge_api/README.md
@@ -85,7 +85,10 @@ others.
For example:
```rust
-#[derive(Debug)]
+use tedge_api::{Message, TypeUuid};
+
+#[derive(Debug, TypeUuid)]
+#[uuid = "b60dd50c-ccef-4204-b370-18bbbb68d6e2"]
struct Value(f64);
impl Message for Value {}
diff --git a/crates/core/tedge_api/examples/heartbeat.rs b/crates/core/tedge_api/examples/heartbeat.rs
index b253009b..8d64232a 100644
--- a/crates/core/tedge_api/examples/heartbeat.rs
+++ b/crates/core/tedge_api/examples/heartbeat.rs
@@ -10,17 +10,20 @@ use tedge_api::{
PluginError,
};
use tokio::sync::RwLock;
+use type_uuid::TypeUuid;
+#[derive(Debug, TypeUuid)]
+#[uuid = "94916be9-17ba-4bca-a3a0-408d33136fed"]
/// A message that represents a heartbeat that gets sent to plugins
-#[derive(Debug)]
struct Heartbeat;
impl Message for Heartbeat {}
impl AcceptsReplies for Heartbeat {
type Reply = HeartbeatStatus;
}
+#[derive(Debug, TypeUuid)]
+#[uuid = "a6d03c65-51bf-4f89-b383-c67c9ed8533b"]
/// The reply for a heartbeat
-#[derive(Debug)]
enum HeartbeatStatus {
Alive,
Degraded,
diff --git a/crates/core/tedge_api/examples/universal_log.rs b/crates/core/tedge_api/examples/universal_log.rs
index 34090040..064ffa22 100644
--- a/crates/core/tedge_api/examples/universal_log.rs
+++ b/crates/core/tedge_api/examples/universal_log.rs
@@ -10,13 +10,16 @@ use tedge_api::{
PluginError,
};
use tokio::sync::RwLock;
+use type_uuid::TypeUuid;
/// A message that represents a heartbeat that gets sent to plugins
-#[derive(Debug)]
+#[derive(Debug, TypeUuid)]
+#[uuid = "1f807f7b-888f-4881-a1b5-16380e32f8c2"]
struct Heartbeat;
impl Message for Heartbeat {}
-#[derive(Debug)]
+#[derive(Debug, TypeUuid)]
+#[uuid = "346e233f-c24a-47e0-a15b-3ec0d1e19019"]
struct RandomData;
impl Message for RandomData {}
diff --git a/crates/core/tedge_api/src/address.rs b/crates/core/tedge_api/src/address.rs
index 47b2fdea..4249ecfc 100644
--- a/crates/core/tedge_api/src/address.rs
+++ b/crates/core/tedge_api/src/address.rs
@@ -4,9 +4,7 @@ use futures::future::BoxFuture;
use tokio::sync::RwLock;
use tracing::{instrument, trace};
-use crate::{
- message::{Message, MessageType, AcceptsReplies},
-};
+use crate::message::{AcceptsReplies, Message, MessageType};
#[doc(hidden)]
pub type AnyMessageBox = Box<dyn Message>;
@@ -362,13 +360,16 @@ pub trait Contains<M: Message> {}
///
/// ```rust
/// # use tedge_api::{Message, make_receiver_bundle};
+/// # use type_uuid::TypeUuid;
///
-/// #[derive(Debug)]
+/// #[derive(Debug, TypeUuid)]
+/// #[uuid = "b4e62630-0404-4d39-b435-95d777029887"]
/// struct IntMessage(u8);
///
/// impl Message for IntMessage { }
///
-/// #[derive(Debug)]
+/// #[derive(Debug, TypeUuid)]
+/// #[uuid = "92734ceb-7b65-499a-95cd-17164f1b3729"]
/// struct StatusMessage(String);
///
/// impl Message for StatusMessage { }
@@ -405,6 +406,7 @@ mod tests {
use static_assertions::{assert_impl_all, assert_not_impl_any};
use tokio::sync::RwLock;
+ use type_uuid::TypeUuid;
use crate::{
address::{InnerMessageSender, ReplyReceiverFor, ReplySenderFor},
@@ -413,7 +415,8 @@ mod tests {
Address,
};
- #[derive(Debug)]
+ #[derive(Debug, TypeUuid)]
+ #[uuid = "df2b8bb3-8c15-49bb-8d11-cc14d7f3b000"]
struct Foo;
impl Message for Foo {}
@@ -421,12 +424,14 @@ mod tests {
type Reply = Bar;
}
- #[derive(Debug)]
+ #[derive(Debug, TypeUuid)]
+ #[uuid = "953a243d-333a-4870-8297-272fff6262b5"]
struct Bar;
impl Message for Bar {}
- #[derive(Debug)]
+ #[derive(Debug, TypeUuid)]
+ #[uuid = "fe98650c-b067-47f4-8fd8-2f3ed04fdc21"]
struct Blub;
impl Message for Blub {}
diff --git a/crates/core/tedge_api/src/lib.rs b/crates/core/tedge_api/src/lib.rs
index 758c33aa..f9716981 100644
--- a/crates/core/tedge_api/src/lib.rs
+++ b/crates/core/tedge_api/src/lib.rs
@@ -33,6 +33,9 @@ pub use tokio_util::sync::CancellationToken;
/// Derive macro for self-describing configurations
pub use tedge_config_derive::Config;
+/// Derive macro for type uuids
+pub use type_uuid::TypeUuid;
+
#[doc(hidden)]
pub mod _internal {
pub use futures::future::BoxFuture;
diff --git a/crates/core/tedge_api/src/message.rs b/crates/core/tedge_api/src/message.rs
index 7fe1fc1a..9df11b51 100644
--- a/crates/core/tedge_api/src/message.rs
+++ b/crates/core/tedge_api/src/message.rs
@@ -1,5 +1,6 @@
use downcast_rs::{impl_downcast, DowncastSync};
use serde::Serialize;
+use type_uuid::{TypeUuid, TypeUuidDynamic};
use crate::address::AnyMessageBox;
@@ -7,7 +8,10 @@ use crate::address::AnyMessageBox;
///
/// This trait is a marker trait for all types that can be used as messages which can be sent
/// between plugins in thin-edge.
-pub trait Message: Send + std::fmt::Debug + DynMessage + DowncastSync + 'static {}
+pub trait Message:
+ Send + std::fmt::Debug + DynMessage + DowncastSync + TypeUuidDynamic + 'static
+{
+}
impl_downcast!(sync Message);
@@ -33,7 +37,8 @@ pub trait AcceptsReplies: Message {
/// otherwise.
///
/// To construct it, you will need to have a message and call [`AnyMessage::from_message`]
-#[derive(Debug)]
+#[derive(Debug, TypeUuid)]
+#[uuid = "e7e5c87b-2022-4687-8650-DEADBEEEEEEF"]
pub struct AnyMessage(pub(crate) AnyMessageBox);
impl std::ops::Deref for AnyMessage {
@@ -136,7 +141,8 @@ impl MessageType {
}
/// A message to tell the core to stop thin-edge
-#[derive(Debug)]
+#[derive(Debug, TypeUuid)]
+#[uuid = "812b7235-671f-4722-b01a-333578b2a4ea"]
pub struct StopCore;
impl Message for StopCore {}
@@ -145,16 +151,20 @@ crate::make_receiver_bundle!(pub struct CoreMessages(StopCore));
#[cfg(test)]
mod tests {
+ use type_uuid::TypeUuid;
+
use crate::Message;
use super::{AnyMessage, MessageType};
- #[derive(Debug)]
+ #[derive(Debug, TypeUuid)]
+ #[uuid = "0c2ed228-5ff0-4ba5-a0d3-3648f7eb6558"]
struct Bar;
impl Message for Bar {}
- #[derive(Debug)]
+ #[derive(Debug, TypeUuid)]
+ #[uuid = "8c3beacb-327d-422d-a914-47006d521ba5"]
struct Foo;
impl Message for Foo {}
diff --git a/crates/core/tedge_api/src/plugin.rs b/crates/core/tedge_api/src/plugin.rs
index 1b3be154..6772805a 100644
--- a/crates/core/tedge_api/src/plugin.rs
+++ b/crates/core/tedge_api/src/plugin.rs
@@ -96,8 +96,10 @@ pub trait PluginBuilder<PD: PluginDirectory>: Sync + Send + 'static {
///
/// ```no_run
/// # use tedge_api::{Plugin, plugin::BuiltPlugin, PluginError, PluginExt, PluginDirectory, PluginBuilder, PluginConfiguration};
+ /// # use type_uuid::TypeUuid;
///
- /// #[derive(Debug)]
+ /// #[derive(Debug, TypeUuid)]
+ /// #[uuid = "46f5d318-4158-4726-83dd-9b310cae3328"]
/// struct MyMessage;
/// impl tedge_api::Message for MyMessage { }
///
@@ -217,8 +219,10 @@ pub trait PluginBuilder<PD: PluginDirectory>: Sync + Send + 'static {
/// # use tedge_api::PluginBuilder;
/// # use tedge_api::PluginDirectory;
/// # use tedge_api::PluginExt;
+ /// # use type_uuid::TypeUuid;
///
- /// #[derive(Debug)]
+ /// #[derive(Debug, TypeUuid)]
+ /// #[uuid = "39046e3e-05ad-4b16-bbf1-8c2d2da5b668"]
/// struct MyMessage;
/// impl tedge_api::Message for MyMessage { }
///
@@ -383,8 +387,10 @@ impl HandleTypes {
/// # use tedge_api::address::ReplySenderFor;
/// # use tedge_api::PluginError;
/// # use tedge_api::PluginExt;
+ /// # use type_uuid::TypeUuid;
///
- /// #[derive(Debug)]
+ /// #[derive(Debug, TypeUuid)]
+ /// #[uuid = "1276aa9c-5e04-4ab3-a987-61d89765ab33"]
/// struct Heartbeat;
///
/// impl tedge_api::Message for Heartbeat { }
@@ -671,12 +677,14 @@ mod tests {
use super::{Plugin, PluginBuilder};
use static_assertions::assert_obj_safe;
+ use type_uuid::TypeUuid;
// Object Safety
assert_obj_safe!(PluginBuilder<()>);
assert_obj_safe!(Plugin);
- #[derive(Debug)]
+ #[derive(Debug, TypeUuid)]
+ #[uuid = "44d61fba-0055-4333-86bf-e96e06f7aea8"]
struct Blub;
impl Message for Blub {}