kxio 1.1.2

Provides injectable Filesystem and Network resources to make code more testable
Documentation
use std::{
    collections::HashMap,
    ops::{Deref, DerefMut},
};

use crate::network::HeaderMap;

#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct NetRequestHeaders(HashMap<String, String>);
impl NetRequestHeaders {
    pub fn new() -> Self {
        Self::default() //(HashMap::new())
    }
    pub fn with(mut self, key: &str, value: &str) -> Self {
        self.0.insert(key.into(), value.into());
        self
    }
}
impl<T> From<T> for NetRequestHeaders
where
    T: Into<HashMap<String, String>>,
{
    fn from(x: T) -> Self {
        Self(x.into())
    }
}
impl TryFrom<NetRequestHeaders> for HeaderMap {
    type Error = http::Error;
    fn try_from(x: NetRequestHeaders) -> Result<Self, Self::Error> {
        Self::try_from(&x.0)
    }
}
impl Deref for NetRequestHeaders {
    type Target = HashMap<String, String>;
    fn deref(&self) -> &Self::Target {
        &self.0
    }
}
impl DerefMut for NetRequestHeaders {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.0
    }
}

#[cfg(test)]
mod tests {

    use assert2::let_assert;
    use pretty_assertions::assert_eq;

    use super::*;

    #[test_log::test]
    fn test_net_request_headers_from_hash_map() {
        let nrh = NetRequestHeaders::from(
            [("a", "b"), ("c", "d")]
                .iter()
                .map(|(k, v)| (k.to_string(), v.to_string()))
                .collect::<HashMap<_, _>>(),
        );
        assert_eq!(nrh.len(), 2);
        let_assert!(Some(a) = nrh.get("a"));
        assert_eq!(a, "b");
        let_assert!(Some(c) = nrh.get("c"));
        assert_eq!(c, "d");
    }

    #[test_log::test]
    fn test_net_request_headers_with_new_entry() {
        let nrh = NetRequestHeaders::from(
            [("a", "b"), ("c", "d")]
                .iter()
                .map(|(k, v)| (k.to_string(), v.to_string()))
                .collect::<HashMap<_, _>>(),
        )
        .with("e", "f");
        assert_eq!(nrh.len(), 3);
        let_assert!(Some(a) = nrh.get("a"));
        assert_eq!(a, "b");
        let_assert!(Some(c) = nrh.get("c"));
        assert_eq!(c, "d");
        let_assert!(Some(e) = nrh.get("e"));
        assert_eq!(e, "f");
    }

    #[test_log::test]
    fn test_net_request_headers_try_into_header_map() {
        let result: Result<HeaderMap, http::Error> = NetRequestHeaders::from(
            [("a", "b"), ("c", "d")]
                .iter()
                .map(|(k, v)| (k.to_string(), v.to_string()))
                .collect::<HashMap<_, _>>(),
        )
        .try_into();
        let_assert!(Ok(hm) = result);
        assert_eq!(hm.len(), 2);
        let_assert!(Some(a) = hm.get("a"));
        assert_eq!(a, "b");
        let_assert!(Some(c) = hm.get("c"));
        assert_eq!(c, "d");
    }
}