1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
use crate::{Pack, EncodeError, Unpack, DecodeError};
use std::io::{Write, Read};

/// Encodes a given key and value as a property as used by `Dictionary`. This can be used as a flat
/// shortcut to encode any key-value pair using PackStream. Keys are strings and encoded values can
/// be anything which implements [`Pack`](crate::packable::Pack). Returns the number of bytes written
/// to the stream.
pub fn encode_property<T: Write, V: Pack>(key: &str, value: &V, writer: &mut T) -> Result<usize, EncodeError> {
    Ok(String::from(key).encode(writer)? + value.encode(writer)?)
}

/// Decodes a key-value pair using PackStream. Keys are strings, but values can be anything which
/// implements [`Unpack`](crate::packable::Unpack).
pub fn decode_property<T: Read, V: Unpack>(reader: &mut T) -> Result<(String, V), DecodeError> {
    let key = String::decode(reader)?;
    let value = V::decode(reader)?;
    Ok((key, value))
}