tokio_util_codec_compose/decode/adaptors/
map_into.rs1use bytes::BytesMut;
4use std::{io, marker::PhantomData};
5use tokio_util::codec::Decoder;
6
7#[must_use = "decoders do nothing unless used"]
11#[derive(Debug)]
12pub struct DecoderMapInto<D, B> {
13 inner: D,
14 _target: PhantomData<B>,
15}
16
17impl<D, B> DecoderMapInto<D, B> {
18 pub(in crate::decode) fn new(inner: D) -> Self {
19 Self {
20 inner,
21 _target: PhantomData,
22 }
23 }
24}
25
26impl<D, A, B, E> Decoder for DecoderMapInto<D, B>
27where
28 D: Decoder<Item = A, Error = E>,
29 B: From<A>,
30 E: From<io::Error>,
31{
32 type Item = B;
33
34 type Error = E;
35
36 fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
37 Ok(self.inner.decode(src)?.map(B::from))
38 }
39}
40
41#[cfg(test)]
42mod tests {
43 use super::*;
44
45 use crate::{decode::DecoderExt, primitives::uint8};
46
47 #[test]
48 fn decode_map_into() -> anyhow::Result<()> {
49 let mut decoder = uint8().map_into::<Device>();
50
51 let mut src = BytesMut::from("\x01");
52 let value = decoder.decode(&mut src)?;
53
54 assert!(matches!(value, Some(Device(0x01))));
55 assert_eq!(src, BytesMut::default());
56
57 Ok(())
58 }
59
60 #[derive(Debug, PartialEq, Eq)]
61 struct Device(u8);
62 impl From<u8> for Device {
63 fn from(value: u8) -> Self {
64 Self(value)
65 }
66 }
67}