Skip to main content

tuwunel_service/sending/
dest.rs

1use std::fmt::Debug;
2
3use ruma::{OwnedServerName, OwnedUserId};
4use tuwunel_core::implement;
5
6#[derive(Clone, Debug, PartialEq, Eq, Hash)]
7pub enum Destination {
8	Appservice(String),
9	Push(OwnedUserId, String), // user and pushkey
10	Federation(OwnedServerName),
11}
12
13#[implement(Destination)]
14#[must_use]
15pub(super) fn get_prefix(&self) -> Vec<u8> {
16	match self {
17		| Self::Federation(server) => {
18			let len = server.as_bytes().len().saturating_add(1);
19
20			let mut p = Vec::with_capacity(len);
21			p.extend_from_slice(server.as_bytes());
22			p.push(0xFF);
23			p
24		},
25		| Self::Appservice(server) => {
26			let sigil = b"+";
27			let len = sigil
28				.len()
29				.saturating_add(server.len())
30				.saturating_add(1);
31
32			let mut p = Vec::with_capacity(len);
33			p.extend_from_slice(sigil);
34			p.extend_from_slice(server.as_bytes());
35			p.push(0xFF);
36			p
37		},
38		| Self::Push(user, pushkey) => {
39			let sigil = b"$";
40			let len = sigil
41				.len()
42				.saturating_add(user.as_bytes().len())
43				.saturating_add(1)
44				.saturating_add(pushkey.len())
45				.saturating_add(1);
46
47			let mut p = Vec::with_capacity(len);
48			p.extend_from_slice(sigil);
49			p.extend_from_slice(user.as_bytes());
50			p.push(0xFF);
51			p.extend_from_slice(pushkey.as_bytes());
52			p.push(0xFF);
53			p
54		},
55	}
56}