distant_net/common/packet/
header.rs1use std::collections::HashMap;
2use std::ops::{Deref, DerefMut};
3use std::{fmt, io};
4
5use derive_more::IntoIterator;
6use serde::de::DeserializeOwned;
7use serde::{Deserialize, Serialize};
8
9use crate::common::{utils, Value};
10
11#[macro_export]
19macro_rules! header {
20    ($($key:literal -> $value:expr),* $(,)?) => {{
21        let mut _header = $crate::common::Header::default();
22
23        $(
24            _header.insert($key, $value);
25        )*
26
27        _header
28    }};
29}
30
31#[derive(Clone, Debug, Default, PartialEq, Eq, IntoIterator, Serialize, Deserialize)]
33#[serde(transparent)]
34pub struct Header(HashMap<String, Value>);
35
36impl Header {
37    pub fn new() -> Self {
39        Self::default()
40    }
41
42    #[inline]
44    pub(crate) fn is_empty(&self) -> bool {
45        self.0.is_empty()
46    }
47
48    pub fn insert(&mut self, key: impl Into<String>, value: impl Into<Value>) -> Option<Value> {
57        self.0.insert(key.into(), value.into())
58    }
59
60    pub fn get_as<T>(&self, key: impl AsRef<str>) -> Option<io::Result<T>>
63    where
64        T: DeserializeOwned,
65    {
66        self.0
67            .get(key.as_ref())
68            .map(|value| value.clone().cast_as())
69    }
70
71    pub fn to_vec(&self) -> io::Result<Vec<u8>> {
73        utils::serialize_to_vec(self)
74    }
75
76    pub fn from_slice(slice: &[u8]) -> io::Result<Self> {
78        utils::deserialize_from_slice(slice)
79    }
80}
81
82impl Deref for Header {
83    type Target = HashMap<String, Value>;
84
85    fn deref(&self) -> &Self::Target {
86        &self.0
87    }
88}
89
90impl DerefMut for Header {
91    fn deref_mut(&mut self) -> &mut Self::Target {
92        &mut self.0
93    }
94}
95
96impl fmt::Display for Header {
97    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
98        write!(f, "{{")?;
99
100        for (key, value) in self.0.iter() {
101            let value = serde_json::to_string(value).unwrap_or_else(|_| String::from("--"));
102            write!(f, "\"{key}\" = {value}")?;
103        }
104
105        write!(f, "}}")?;
106
107        Ok(())
108    }
109}