tokio_util_codec_compose/decode/adaptors/
map_into.rs

1//! An adaptor for non-fallible mappings with implicit conversions.
2
3use bytes::BytesMut;
4use std::{io, marker::PhantomData};
5use tokio_util::codec::Decoder;
6
7/// A decoder for applying a non-fallible conversion onto the success type.
8///
9/// The result of [`crate::decode::DecoderExt::map_into`].
10#[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}