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