datex_core/global/protocol_structures/
encrypted_header.rs1use super::serializable::Serializable;
2use crate::values::core_values::endpoint::Endpoint;
3use binrw::{BinRead, BinWrite};
4
5use modular_bitfield::{Specifier, bitfield};
6
7#[derive(
9 serde::Serialize,
10 serde::Deserialize,
11 Debug,
12 PartialEq,
13 Clone,
14 Default,
15 Specifier,
16)]
17pub enum UserAgent {
18 #[default]
19 Unknown = 0,
20 Human = 1,
21 Bot = 2,
22 Service = 3,
23
24 #[allow(unused)]
25 Unused0 = 4,
26 #[allow(unused)]
27 Unused1 = 5,
28 #[allow(unused)]
29 Unused2 = 6,
30 #[allow(unused)]
31 Unused3 = 7,
32 #[allow(unused)]
33 Unused4 = 8,
34 #[allow(unused)]
35 Unused5 = 9,
36 #[allow(unused)]
37 Unused6 = 10,
38 #[allow(unused)]
39 Unused7 = 11,
40 #[allow(unused)]
41 Unused8 = 12,
42 #[allow(unused)]
43 Unused9 = 13,
44 #[allow(unused)]
45 Unused10 = 14,
46 #[allow(unused)]
47 Unused11 = 15,
48}
49
50#[bitfield]
52#[derive(BinWrite, BinRead, Clone, Copy, Debug, PartialEq)]
53#[bw(map = |&x| Self::into_bytes(x))]
54#[br(map = Self::from_bytes)]
55
56pub struct Flags {
57 pub user_agent: UserAgent,
58 pub has_on_behalf_of: bool,
59
60 #[allow(unused)]
61 unused_0: bool,
62 #[allow(unused)]
63 unused_1: bool,
64 #[allow(unused)]
65 unused_2: bool,
66}
67impl Default for Flags {
68 fn default() -> Self {
69 Self::new()
70 .with_user_agent(UserAgent::default())
71 .with_has_on_behalf_of(false)
72 }
73}
74
75mod flags_serde {
76 use super::*;
77 use crate::global::protocol_structures::encrypted_header::Flags;
78 use serde::{Deserialize, Deserializer, Serialize, Serializer};
79
80 #[derive(Serialize, Deserialize)]
81 struct FlagsHelper {
82 user_agent: UserAgent,
83 has_on_behalf_of: bool,
84 }
85
86 impl Serialize for Flags {
87 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
88 where
89 S: Serializer,
90 {
91 let helper = FlagsHelper {
92 user_agent: self.user_agent(),
93 has_on_behalf_of: self.has_on_behalf_of(),
94 };
95 helper.serialize(serializer)
96 }
97 }
98
99 impl<'de> Deserialize<'de> for Flags {
100 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
101 where
102 D: Deserializer<'de>,
103 {
104 let helper = FlagsHelper::deserialize(deserializer)?;
105 Ok(Flags::new()
106 .with_user_agent(helper.user_agent)
107 .with_has_on_behalf_of(helper.has_on_behalf_of))
108 }
109 }
110}
111
112#[derive(
115 serde::Serialize,
116 serde::Deserialize,
117 Debug,
118 Clone,
119 Default,
120 BinWrite,
121 BinRead,
122 PartialEq,
123)]
124#[brw(little)]
125pub struct EncryptedHeader {
126 pub flags: Flags,
127
128 #[brw(if (flags.has_on_behalf_of()))]
129 pub on_behalf_of: Option<Endpoint>,
130}
131impl Serializable for EncryptedHeader {}