Skip to main content

actix_telepathy/remote/
message.rs

1use crate::{CustomSerialization, NetworkInterface, RemoteAddr};
2use actix::prelude::*;
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6/// Wrapper for messages to be sent to remote actor
7#[derive(Message, Serialize, Deserialize, Debug)]
8#[rtype(result = "()")]
9pub struct RemoteWrapper {
10    pub destination: RemoteAddr,
11    #[serde(skip_serializing)]
12    #[serde(skip_deserializing)]
13    pub message_buffer: Vec<u8>,
14    pub identifier: String,
15    #[serde(skip_serializing)]
16    #[serde(skip_deserializing)]
17    pub source: Option<Addr<NetworkInterface>>,
18    pub conversation_id: Option<Uuid>,
19}
20
21impl RemoteWrapper {
22    pub fn new<T: RemoteMessage>(
23        destination: RemoteAddr,
24        message: T,
25        conversation_id: Option<Uuid>,
26    ) -> RemoteWrapper {
27        let serializer = message.get_serializer();
28        RemoteWrapper {
29            destination,
30            message_buffer: serializer
31                .serialize(&message)
32                .expect("Cannot serialize message"),
33            identifier: message.get_identifier().to_string(),
34            source: None,
35            conversation_id,
36        }
37    }
38}
39
40impl Clone for RemoteWrapper {
41    fn clone(&self) -> Self {
42        RemoteWrapper {
43            destination: self.destination.clone(),
44            message_buffer: self.message_buffer.clone(),
45            identifier: self.identifier.clone(),
46            source: self.source.clone(),
47            conversation_id: self.conversation_id,
48        }
49    }
50}
51
52/// Helper Trait to prepare messages to be sent over the network
53pub trait RemoteMessage
54where
55    Self: Message + Send + Serialize,
56{
57    type Serializer: CustomSerialization;
58    const IDENTIFIER: &'static str;
59
60    fn get_identifier(&self) -> &str {
61        Self::IDENTIFIER
62    }
63
64    fn get_serializer(&self) -> Box<Self::Serializer>;
65
66    fn generate_serializer() -> Box<Self::Serializer>;
67
68    fn set_source(&mut self, source: Addr<NetworkInterface>);
69}