1use std::str::from_utf8;
2
3use crate::{Body, Error};
4
5pub(crate) mod sealed {
6 pub trait Sealed {}
7}
8
9pub trait Read: self::sealed::Sealed {
11 #[doc(hidden)]
13 fn read_from<'de>(buf: &mut Body<'de>) -> Result<&'de Self, Error>;
14}
15
16impl self::sealed::Sealed for [u8] {}
17
18impl Read for [u8] {
19 #[inline]
20 fn read_from<'de>(buf: &mut Body<'de>) -> Result<&'de Self, Error> {
21 let len = buf.load::<u32>()? as usize;
22 buf.load_slice(len)
23 }
24}
25
26impl self::sealed::Sealed for str {}
27
28impl Read for str {
29 #[inline]
30 fn read_from<'de>(buf: &mut Body<'de>) -> Result<&'de Self, Error> {
31 let len = buf.load::<u32>()? as usize;
32 let bytes = buf.load_slice_nul(len)?;
33 Ok(from_utf8(bytes)?)
34 }
35}