tokio_dbus/
read.rs

1use std::str::from_utf8;
2
3use crate::{Body, Error};
4
5pub(crate) mod sealed {
6    pub trait Sealed {}
7}
8
9/// A type who's reference can be read directly from a buffer.
10pub trait Read: self::sealed::Sealed {
11    /// Read the type from the given buffer.
12    #[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}