summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock27
-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
9 files changed, 85 insertions, 22 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 100ef892..36dac215 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2872,6 +2872,7 @@ dependencies = [
"tokio-util 0.7.0",
"toml",
"tracing",
+ "type-uuid",
]
[[package]]
@@ -3396,6 +3397,26 @@ dependencies = [
]
[[package]]
+name = "type-uuid"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15043bca41f43205c9b0055d365a405d81b8e4a8ff99c36b263cf79ad1f4c051"
+dependencies = [
+ "type-uuid-derive",
+]
+
+[[package]]
+name = "type-uuid-derive"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e090ee857961c746ecf7fb596022493ffaad54d189061df49f7a0cf17796dc1"
+dependencies = [
+ "quote 1.0.18",
+ "syn 1.0.93",
+ "uuid",
+]
+
+[[package]]
name = "typed-arena"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3490,6 +3511,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]]
+name = "uuid"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
+
+[[package]]
name = "value-bag"
version = "1.0.0-alpha.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
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 {}