From b97f80997f125d3af8418c09a96bdef21010ce13 Mon Sep 17 00:00:00 2001 From: Chip Senkbeil Date: Sun, 11 Jun 2023 15:06:24 -0500 Subject: [PATCH] Refactor header into newtype --- distant-net/src/common/packet.rs | 31 ++---------- distant-net/src/common/packet/header.rs | 57 +++++++++++++++++++++++ distant-net/src/common/packet/request.rs | 1 + distant-net/src/common/packet/response.rs | 1 + 4 files changed, 64 insertions(+), 26 deletions(-) create mode 100644 distant-net/src/common/packet/header.rs diff --git a/distant-net/src/common/packet.rs b/distant-net/src/common/packet.rs index d76cd7b..c55fe2d 100644 --- a/distant-net/src/common/packet.rs +++ b/distant-net/src/common/packet.rs @@ -1,37 +1,16 @@ -/// Represents a generic id type -pub type Id = String; - -/// Represents a packet header for a request or response -pub type Header = std::collections::HashMap; - -/// Generates a new [`Header`] of key/value pairs based on literals. -/// -/// ``` -/// use distant_net::header; -/// -/// let _header = header!("key" -> "value", "key2" -> 123); -/// ``` -#[macro_export] -macro_rules! header { - ($($key:literal -> $value:expr),* $(,)?) => {{ - let mut _header = ::std::collections::HashMap::new(); - - $( - _header.insert($key.to_string(), $crate::common::Value::from($value)); - )* - - _header - }}; -} - +mod header; mod request; mod response; +pub use header::*; pub use request::*; pub use response::*; use std::io::Cursor; +/// Represents a generic id type +pub type Id = String; + /// Reads the header bytes from msgpack input, including the marker and len bytes. /// /// * If succeeds, returns (header, remaining). diff --git a/distant-net/src/common/packet/header.rs b/distant-net/src/common/packet/header.rs new file mode 100644 index 0000000..a876c0c --- /dev/null +++ b/distant-net/src/common/packet/header.rs @@ -0,0 +1,57 @@ +use crate::common::Value; +use derive_more::IntoIterator; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::ops::{Deref, DerefMut}; + +/// Generates a new [`Header`] of key/value pairs based on literals. +/// +/// ``` +/// use distant_net::header; +/// +/// let _header = header!("key" -> "value", "key2" -> 123); +/// ``` +#[macro_export] +macro_rules! header { + ($($key:literal -> $value:expr),* $(,)?) => {{ + let mut _header = ::std::collections::HashMap::new(); + + $( + _header.insert($key.to_string(), $crate::common::Value::from($value)); + )* + + $crate::common::Header::new(_header) + }}; +} + +/// Represents a packet header for a request or response +#[derive(Clone, Debug, Default, PartialEq, Eq, IntoIterator, Serialize, Deserialize)] +#[serde(transparent)] +pub struct Header(HashMap); + +impl Header { + /// Creates a new [`Header`] newtype wrapper. + pub fn new(map: HashMap) -> Self { + Self(map) + } + + /// Exists purely to support serde serialization checks. + #[inline] + pub(crate) fn is_empty(&self) -> bool { + self.0.is_empty() + } +} + +impl Deref for Header { + type Target = HashMap; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for Header { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} diff --git a/distant-net/src/common/packet/request.rs b/distant-net/src/common/packet/request.rs index c70a052..bd74e34 100644 --- a/distant-net/src/common/packet/request.rs +++ b/distant-net/src/common/packet/request.rs @@ -7,6 +7,7 @@ use serde::{Deserialize, Serialize}; use super::{read_header_bytes, read_key_eq, read_str_bytes, Header, Id}; use crate::common::utils; +use crate::header; /// Represents a request to send #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] diff --git a/distant-net/src/common/packet/response.rs b/distant-net/src/common/packet/response.rs index 55739a4..6056fe6 100644 --- a/distant-net/src/common/packet/response.rs +++ b/distant-net/src/common/packet/response.rs @@ -7,6 +7,7 @@ use serde::{Deserialize, Serialize}; use super::{read_header_bytes, read_key_eq, read_str_bytes, Header, Id}; use crate::common::utils; +use crate::header; /// Represents a response received related to some response #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]