jppe 1.1.1

This is a byte stream structured serialization and deserialization library.
Documentation
use crate::std::*;
use std::collections::HashMap;


macro_rules! hashmap_encode_bytes {
    ($value:expr, $input:expr, $fattr:expr) => {
        let mut linend = &b"\r\n"[..];
        let mut split_str = &b": "[..];

        if let Some(fattr) = $fattr {
            if let Some(linend_value) = &fattr.linend_value {
                linend = linend_value;
            }
    
            if let Some(split) = &fattr.split {
                split_str = split;
            }    
        }

        for (key, value) in $value {
            $input.extend(key.to_vec());
            $input.extend(split_str.clone());
            $input.extend(value.to_vec());
            $input.extend(linend.clone());
        }
    };
}


macro_rules! hashmap_encode_bytes2 {
    ($value:expr, $input:expr, $fattr:expr) => {
        let mut linend = &b"\r\n"[..];
        let mut split_str = &b": "[..];

        if let Some(fattr) = $fattr {
            if let Some(linend_value) = &fattr.linend_value {
                linend = linend_value;
            }
    
            if let Some(split) = &fattr.split {
                split_str = split;
            }    
        }

        for (key, value) in $value {
            $input.extend(key.as_bytes().to_vec());
            $input.extend(split_str.clone());
            $input.extend(value.as_bytes().to_vec());
            $input.extend(linend.clone());
        }
    };
}



impl crate::ByteEncode for HashMap<&[u8], &[u8]> {
    fn encode(&self, input: &mut Vec<u8>, _cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>)
        where 
            Self: Sized
    {
        hashmap_encode_bytes!(self , input, fattr);
    }
}


impl crate::BorrowByteEncode for HashMap<&[u8], &[u8]> {
    fn encode(&self, input: &mut Vec<u8>, _cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>)
        where 
            Self: Sized
    {
        hashmap_encode_bytes!(self, input, fattr);
    }
}


impl crate::ByteEncode for HashMap<&str, &str> {
    fn encode(&self, input: &mut Vec<u8>, _cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>)
        where 
            Self: Sized
    {
        hashmap_encode_bytes2!(self, input, fattr);
    }
}


impl crate::BorrowByteEncode for HashMap<&str, &str> {
    fn encode(&self, input: &mut Vec<u8>, _cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>)
        where 
            Self: Sized
    {
        hashmap_encode_bytes2!(self, input, fattr);
    }
}


impl crate::ByteEncode for HashMap<String, String> {
    fn encode(&self, input: &mut Vec<u8>, _cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>)
        where 
            Self: Sized
    {
        hashmap_encode_bytes2!(self, input, fattr);
    }
}


impl crate::BorrowByteEncode for HashMap<String, String> {
    fn encode(&self, input: &mut Vec<u8>, _cattr: Option<&crate::ContainerAttrModifiers>, fattr: Option<&crate::FieldAttrModifiers>)
        where 
            Self: Sized
    {
        hashmap_encode_bytes2!(self, input, fattr);
    }
}


#[cfg(test)]
mod tests {
    use std::collections::HashMap;
    use crate::ByteEncode;

    #[test]
    fn test_impls_hashmap_encode() {
        let mut hashmap_value = HashMap::new();
        hashmap_value.insert("A1".to_string(), "jkc1".to_string());
        hashmap_value.insert("A2".to_string(), "jkc2".to_string());
        hashmap_value.insert("A3".to_string(), "".to_string());
        let mut buf = vec![];
        hashmap_value.encode(&mut buf, None, None);
        let value = String::from_utf8_lossy(&buf).to_string();
        println!("{value:?}");
    }
}