1use crate::{EndpointID, Error, Label, MemoryRegion, Object, Selector, Version};
2use serde::{Deserialize, Serialize};
3use type_uuid::{Bytes, TypeUuid};
4
5pub struct Message<T> {
6 pub(crate) selector: Selector,
7 pub payload: T,
8 pub objects: Vec<Object>,
9 pub memory_regions: Vec<MemoryRegion>,
10}
11
12impl<T: MessageBox> Message<T> {
13 pub fn new(mut selector: Selector, payload: T) -> Self {
14 selector.uuid = payload.uuid();
15
16 Self {
17 selector,
18 payload,
19 objects: vec![],
20 memory_regions: vec![],
21 }
22 }
23}
24
25pub trait MessageBox: Send + 'static {
26 fn decode(uuid: Bytes, data: &[u8]) -> Result<Self, Error>
27 where
28 Self: Sized;
29
30 fn encode(&self) -> Result<Vec<u8>, Error>;
31
32 fn uuid(&self) -> Bytes;
33}
34
35#[derive(Debug, Serialize, Deserialize, TypeUuid)]
37#[uuid = "dd95ba8e-1279-47cf-925e-83e614e79588"]
38pub struct BytesMessage {
39 pub format: u16,
40 #[serde(with = "serde_bytes")]
41 pub data: Vec<u8>,
42}
43
44#[cfg(windows)]
45#[derive(Debug, Serialize, Deserialize, TypeUuid)]
46#[uuid = "fbf88372-d2cd-425a-a183-133f8f119df2"]
47pub struct FetchProcessHandleMessage {
48 pub pid: u32,
49 pub reply_pipe: String,
50}
51
52#[derive(Debug, Serialize, Deserialize, TypeUuid)]
53#[uuid = "b2c1deb3-3091-4a74-a99c-c8e8d710d4b2"]
54pub struct ConnectMessage {
55 pub version: Version,
56 pub token: String,
57 pub label: Label,
58}
59
60#[derive(Debug, Serialize, Deserialize, TypeUuid)]
61#[uuid = "c3de9eb4-c310-4c14-9747-093d62c09998"]
62pub enum ConnectMessageAck {
63 Ok(EndpointID),
64 ErrVersion(Version),
65 ErrToken,
66}
67
68impl<T: TypeUuid + Serialize + for<'de> Deserialize<'de> + Send + 'static> MessageBox for T {
69 fn decode(uuid: Bytes, data: &[u8]) -> Result<Self, Error>
70 where
71 Self: Sized,
72 {
73 if uuid == T::UUID {
74 crate::decode(data)
75 } else {
76 Err(Error::TypeUuidNotFound)
77 }
78 }
79
80 fn encode(&self) -> Result<Vec<u8>, Error> {
81 crate::encode(self)
82 }
83
84 fn uuid(&self) -> Bytes {
85 T::UUID
86 }
87}