actix_telepathy/remote/
message.rs1use crate::{CustomSerialization, NetworkInterface, RemoteAddr};
2use actix::prelude::*;
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6#[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
52pub 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}