1 use crate::{
2     error::ParseError,
3     stream::buf_reader::{Buffer, Bufferless, CombineBuffer},
4 };
5 
6 use std::{
7     fmt,
8     io::{self, Read},
9 };
10 
11 #[cfg(feature = "pin-project-lite")]
12 use std::pin::Pin;
13 
14 #[derive(Debug)]
15 pub enum Error<E, P> {
16     Parse(E),
17     Io { position: P, error: io::Error },
18 }
19 
20 impl<'a, P> From<Error<crate::easy::Errors<u8, &'a [u8], P>, P>>
21     for crate::easy::Errors<u8, &'a [u8], P>
22 where
23     P: Ord + Clone,
24 {
from(e: Error<crate::easy::Errors<u8, &'a [u8], P>, P>) -> Self25     fn from(e: Error<crate::easy::Errors<u8, &'a [u8], P>, P>) -> Self {
26         match e {
27             Error::Parse(e) => e,
28             Error::Io { position, error } => {
29                 crate::easy::Errors::from_error(position, crate::easy::Error::Other(error.into()))
30             }
31         }
32     }
33 }
34 
35 impl<E, P> std::error::Error for Error<E, P>
36 where
37     E: std::error::Error,
38     P: fmt::Display + fmt::Debug,
39 {
40 }
41 
42 impl<E: fmt::Display, P: fmt::Display> fmt::Display for Error<E, P> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result43     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44         match self {
45             Error::Parse(e) => e.fmt(f),
46             Error::Io { position: _, error } => error.fmt(f),
47         }
48     }
49 }
50 
51 #[derive(Default)]
52 /// Used together with the `decode!` macro
53 pub struct Decoder<S, P, C = Buffer> {
54     position: P,
55     state: S,
56     buffer: C,
57     end_of_input: bool,
58 }
59 
60 impl<S, P> Decoder<S, P, Buffer>
61 where
62     P: Default,
63     S: Default,
64 {
65     /// Constructs a new [`Decoder`] with an internal buffer. Allows any `AsyncRead/Read` instance to
66     /// be used when decoding but there may be data left in the internal buffer after decoding
67     /// (accessible with [`Decoder::buffer`])
new() -> Self68     pub fn new() -> Self {
69         Decoder::default()
70     }
71 
72     /// Constructs a new [`Decoder`] with an internal buffer. Allows any `AsyncRead/Read` instance to
73     /// be used when decoding but there may be data left in the internal buffer after decoding
74     /// (accessible with [`Decoder::buffer`])
new_buffer() -> Self75     pub fn new_buffer() -> Self {
76         Decoder::new()
77     }
78 }
79 
80 impl<S, P> Decoder<S, P, Bufferless>
81 where
82     P: Default,
83     S: Default,
84 {
85     /// Constructs a new `Decoder` without an internal buffer. Requires the read instance to be
86     /// wrapped with combine's [`BufReader`] instance to
87     ///
88     /// [`BufReader`]: super::buf_reader::BufReader
new_bufferless() -> Self89     pub fn new_bufferless() -> Self {
90         Decoder::default()
91     }
92 }
93 
94 impl<S, P> Decoder<S, P> {
buffer(&self) -> &[u8]95     pub fn buffer(&self) -> &[u8] {
96         &self.buffer.0
97     }
98 }
99 
100 impl<S, P, C> Decoder<S, P, C> {
101     #[doc(hidden)]
advance<R>(&mut self, read: &mut R, removed: usize) where C: CombineBuffer<R>,102     pub fn advance<R>(&mut self, read: &mut R, removed: usize)
103     where
104         C: CombineBuffer<R>,
105     {
106         // Remove the data we have parsed and adjust `removed` to be the amount of data we
107         // committed from `self.reader`
108         self.buffer.advance(read, removed)
109     }
110 
111     #[doc(hidden)]
112     #[cfg(feature = "pin-project-lite")]
advance_pin<R>(&mut self, read: Pin<&mut R>, removed: usize) where C: CombineBuffer<R>,113     pub fn advance_pin<R>(&mut self, read: Pin<&mut R>, removed: usize)
114     where
115         C: CombineBuffer<R>,
116     {
117         // Remove the data we have parsed and adjust `removed` to be the amount of data we
118         // committed from `self.reader`
119         self.buffer.advance_pin(read, removed);
120     }
121 
position(&self) -> &P122     pub fn position(&self) -> &P {
123         &self.position
124     }
125 
126     #[doc(hidden)]
__inner(&mut self) -> (&mut S, &mut P, &C, bool)127     pub fn __inner(&mut self) -> (&mut S, &mut P, &C, bool) {
128         (
129             &mut self.state,
130             &mut self.position,
131             &self.buffer,
132             self.end_of_input,
133         )
134     }
135 }
136 
137 impl<S, P, C> Decoder<S, P, C>
138 where
139     C: ,
140 {
141     #[doc(hidden)]
__before_parse<R>(&mut self, mut reader: R) -> io::Result<()> where R: Read, C: crate::stream::buf_reader::CombineSyncRead<R>,142     pub fn __before_parse<R>(&mut self, mut reader: R) -> io::Result<()>
143     where
144         R: Read,
145         C: crate::stream::buf_reader::CombineSyncRead<R>,
146     {
147         if self.buffer.extend_buf_sync(&mut reader)? == 0 {
148             self.end_of_input = true;
149         }
150 
151         Ok(())
152     }
153 }
154 
155 #[cfg(feature = "tokio-02")]
156 impl<S, P, C> Decoder<S, P, C> {
157     #[doc(hidden)]
__before_parse_tokio_02<R>(&mut self, mut reader: Pin<&mut R>) -> io::Result<()> where R: tokio_02_dep::io::AsyncRead, C: crate::stream::buf_reader::CombineRead<R, dyn tokio_02_dep::io::AsyncRead>,158     pub async fn __before_parse_tokio_02<R>(&mut self, mut reader: Pin<&mut R>) -> io::Result<()>
159     where
160         R: tokio_02_dep::io::AsyncRead,
161         C: crate::stream::buf_reader::CombineRead<R, dyn tokio_02_dep::io::AsyncRead>,
162     {
163         let copied =
164             crate::future_ext::poll_fn(|cx| self.buffer.poll_extend_buf(cx, reader.as_mut()))
165                 .await?;
166         if copied == 0 {
167             self.end_of_input = true;
168         }
169 
170         Ok(())
171     }
172 }
173 
174 #[cfg(feature = "tokio-03")]
175 impl<S, P, C> Decoder<S, P, C> {
176     #[doc(hidden)]
__before_parse_tokio_03<R>(&mut self, mut reader: Pin<&mut R>) -> io::Result<()> where R: tokio_03_dep::io::AsyncRead, C: crate::stream::buf_reader::CombineRead<R, dyn tokio_03_dep::io::AsyncRead>,177     pub async fn __before_parse_tokio_03<R>(&mut self, mut reader: Pin<&mut R>) -> io::Result<()>
178     where
179         R: tokio_03_dep::io::AsyncRead,
180         C: crate::stream::buf_reader::CombineRead<R, dyn tokio_03_dep::io::AsyncRead>,
181     {
182         let copied =
183             crate::future_ext::poll_fn(|cx| self.buffer.poll_extend_buf(cx, reader.as_mut()))
184                 .await?;
185         if copied == 0 {
186             self.end_of_input = true;
187         }
188 
189         Ok(())
190     }
191 }
192 
193 #[cfg(feature = "tokio")]
194 impl<S, P, C> Decoder<S, P, C> {
195     #[doc(hidden)]
__before_parse_tokio<R>(&mut self, mut reader: Pin<&mut R>) -> io::Result<()> where R: tokio_dep::io::AsyncRead, C: crate::stream::buf_reader::CombineRead<R, dyn tokio_dep::io::AsyncRead>,196     pub async fn __before_parse_tokio<R>(&mut self, mut reader: Pin<&mut R>) -> io::Result<()>
197     where
198         R: tokio_dep::io::AsyncRead,
199         C: crate::stream::buf_reader::CombineRead<R, dyn tokio_dep::io::AsyncRead>,
200     {
201         let copied =
202             crate::future_ext::poll_fn(|cx| self.buffer.poll_extend_buf(cx, reader.as_mut()))
203                 .await?;
204         if copied == 0 {
205             self.end_of_input = true;
206         }
207 
208         Ok(())
209     }
210 }
211 
212 #[cfg(feature = "futures-03")]
213 impl<S, P, C> Decoder<S, P, C> {
214     #[doc(hidden)]
__before_parse_async<R>(&mut self, reader: Pin<&mut R>) -> io::Result<()> where R: futures_io_03::AsyncRead, C: crate::stream::buf_reader::CombineAsyncRead<R>,215     pub async fn __before_parse_async<R>(&mut self, reader: Pin<&mut R>) -> io::Result<()>
216     where
217         R: futures_io_03::AsyncRead,
218         C: crate::stream::buf_reader::CombineAsyncRead<R>,
219     {
220         let copied = self.buffer.extend_buf(reader).await?;
221 
222         if copied == 0 {
223             self.end_of_input = true;
224         }
225         Ok(())
226     }
227 }
228