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