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