use crate::{
codec::{Decode, Encode},
decoder::BufDecoder,
encoder::BufEncoder,
error::DecodeError
};
const STRING_LIMIT: u32 = 64 * 1024 * 1024;
impl Encode for String {
fn encode(&self, enc: &mut BufEncoder) {
let b = self.as_bytes();
enc.write_u32(b.len() as u32);
enc.write_bytes(b);
}
}
impl Decode for String {
fn decode(dec: &mut BufDecoder<'_>) -> Result<Self, DecodeError> {
let len = dec.read_u32()?;
if len > STRING_LIMIT {
return Err(DecodeError::CollectionTooLarge { len, limit: STRING_LIMIT });
}
let bytes = dec.read_bytes(len as usize)?;
core::str::from_utf8(bytes)
.map(|s| s.to_owned())
.map_err(|_| DecodeError::InvalidUtf8)
}
}
impl Encode for str {
fn encode(&self, enc: &mut BufEncoder) {
let b = self.as_bytes();
enc.write_u32(b.len() as u32);
enc.write_bytes(b);
}
}
impl Encode for &str {
#[inline]
fn encode(&self, enc: &mut BufEncoder) {
(**self).encode(enc);
}
}