use std::fmt;
use crate::{ByteArray, DecodeError, DecodePacket, EncodeError, EncodePacket, StringData};
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct StringPairData(StringData, StringData);
impl StringPairData {
pub fn new(key: &str, value: &str) -> Result<Self, EncodeError> {
let key = StringData::from(key)?;
let value = StringData::from(value)?;
Ok(Self(key, value))
}
#[must_use]
pub const fn key(&self) -> &StringData {
&self.0
}
#[must_use]
pub const fn value(&self) -> &StringData {
&self.1
}
#[must_use]
pub fn bytes(&self) -> usize {
self.0.bytes() + self.1.bytes()
}
}
impl fmt::Display for StringPairData {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "({}, {})", self.0, self.1)
}
}
impl DecodePacket for StringPairData {
fn decode(ba: &mut ByteArray) -> Result<Self, DecodeError> {
let key = StringData::decode(ba)?;
let value = StringData::decode(ba)?;
Ok(Self(key, value))
}
}
impl EncodePacket for StringPairData {
fn encode(&self, buf: &mut Vec<u8>) -> Result<usize, EncodeError> {
let key_len = self.0.encode(buf)?;
let value_len = self.1.encode(buf)?;
Ok(key_len + value_len)
}
}