reqwest_eventsource/
error.rs

1use core::fmt;
2use eventsource_stream::EventStreamError;
3use nom::error::Error as NomError;
4use reqwest::header::HeaderValue;
5use reqwest::Error as ReqwestError;
6use reqwest::Response;
7use reqwest::StatusCode;
8use std::string::FromUtf8Error;
9
10#[cfg(doc)]
11use reqwest::RequestBuilder;
12
13/// Error raised when a [`RequestBuilder`] cannot be cloned. See [`RequestBuilder::try_clone`] for
14/// more information
15#[derive(Debug, Clone, Copy)]
16pub struct CannotCloneRequestError;
17
18impl fmt::Display for CannotCloneRequestError {
19    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
20        f.write_str("expected a cloneable request")
21    }
22}
23
24impl std::error::Error for CannotCloneRequestError {}
25
26/// Error raised by the EventSource stream fetching and parsing
27#[derive(Debug, Error)]
28pub enum Error {
29    /// Source stream is not valid UTF8
30    #[error(transparent)]
31    Utf8(FromUtf8Error),
32    /// Source stream is not a valid EventStream
33    #[error(transparent)]
34    Parser(NomError<String>),
35    /// The HTTP Request could not be completed
36    #[error(transparent)]
37    Transport(ReqwestError),
38    /// The `Content-Type` returned by the server is invalid
39    #[error("Invalid header value: {0:?}")]
40    InvalidContentType(HeaderValue, Response),
41    /// The status code returned by the server is invalid
42    #[error("Invalid status code: {0}")]
43    InvalidStatusCode(StatusCode, Response),
44    /// The `Last-Event-ID` cannot be formed into a Header to be submitted to the server
45    #[error("Invalid `Last-Event-ID`: {0}")]
46    InvalidLastEventId(String),
47    /// The stream ended
48    #[error("Stream ended")]
49    StreamEnded,
50}
51
52impl From<EventStreamError<ReqwestError>> for Error {
53    fn from(err: EventStreamError<ReqwestError>) -> Self {
54        match err {
55            EventStreamError::Utf8(err) => Self::Utf8(err),
56            EventStreamError::Parser(err) => Self::Parser(err),
57            EventStreamError::Transport(err) => Self::Transport(err),
58        }
59    }
60}