reduce size of Error
This commit is contained in:
97
src/error.rs
97
src/error.rs
@@ -50,16 +50,30 @@ use {StatusCode, Url};
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
#[derive(Debug)]
|
||||
pub struct Error {
|
||||
inner: Box<Inner>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Inner {
|
||||
kind: Kind,
|
||||
url: Option<Url>,
|
||||
}
|
||||
|
||||
|
||||
/// A `Result` alias where the `Err` case is `reqwest::Error`.
|
||||
pub type Result<T> = ::std::result::Result<T, Error>;
|
||||
|
||||
impl Error {
|
||||
fn new(kind: Kind, url: Option<Url>) -> Error {
|
||||
Error {
|
||||
inner: Box::new(Inner {
|
||||
kind,
|
||||
url,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns a possible URL related to this error.
|
||||
///
|
||||
/// # Examples
|
||||
@@ -79,12 +93,12 @@ impl Error {
|
||||
/// ```
|
||||
#[inline]
|
||||
pub fn url(&self) -> Option<&Url> {
|
||||
self.url.as_ref()
|
||||
self.inner.url.as_ref()
|
||||
}
|
||||
|
||||
pub(crate) fn with_url(mut self, url: Url) -> Error {
|
||||
debug_assert_eq!(self.url, None, "with_url overriding existing url");
|
||||
self.url = Some(url);
|
||||
debug_assert_eq!(self.inner.url, None, "with_url overriding existing url");
|
||||
self.inner.url = Some(url);
|
||||
self
|
||||
}
|
||||
|
||||
@@ -116,7 +130,7 @@ impl Error {
|
||||
/// ```
|
||||
#[inline]
|
||||
pub fn get_ref(&self) -> Option<&(StdError + Send + Sync + 'static)> {
|
||||
match self.kind {
|
||||
match self.inner.kind {
|
||||
Kind::Http(ref e) => Some(e),
|
||||
Kind::Hyper(ref e) => Some(e),
|
||||
Kind::Mime(ref e) => Some(e),
|
||||
@@ -136,7 +150,7 @@ impl Error {
|
||||
/// Returns true if the error is related to HTTP.
|
||||
#[inline]
|
||||
pub fn is_http(&self) -> bool {
|
||||
match self.kind {
|
||||
match self.inner.kind {
|
||||
Kind::Http(_) => true,
|
||||
Kind::Hyper(_) => true,
|
||||
_ => false,
|
||||
@@ -146,7 +160,7 @@ impl Error {
|
||||
/// Returns true if the error is serialization related.
|
||||
#[inline]
|
||||
pub fn is_serialization(&self) -> bool {
|
||||
match self.kind {
|
||||
match self.inner.kind {
|
||||
Kind::Json(_) |
|
||||
Kind::UrlEncoded(_) => true,
|
||||
_ => false,
|
||||
@@ -156,7 +170,7 @@ impl Error {
|
||||
/// Returns true if the error is from a `RedirectPolicy`.
|
||||
#[inline]
|
||||
pub fn is_redirect(&self) -> bool {
|
||||
match self.kind {
|
||||
match self.inner.kind {
|
||||
Kind::TooManyRedirects |
|
||||
Kind::RedirectLoop => true,
|
||||
_ => false,
|
||||
@@ -166,7 +180,7 @@ impl Error {
|
||||
/// Returns true if the error is from a request returning a 4xx error.
|
||||
#[inline]
|
||||
pub fn is_client_error(&self) -> bool {
|
||||
match self.kind {
|
||||
match self.inner.kind {
|
||||
Kind::ClientError(_) => true,
|
||||
_ => false,
|
||||
}
|
||||
@@ -175,7 +189,7 @@ impl Error {
|
||||
/// Returns true if the error is from a request returning a 5xx error.
|
||||
#[inline]
|
||||
pub fn is_server_error(&self) -> bool {
|
||||
match self.kind {
|
||||
match self.inner.kind {
|
||||
Kind::ServerError(_) => true,
|
||||
_ => false,
|
||||
}
|
||||
@@ -184,7 +198,7 @@ impl Error {
|
||||
/// Returns the status code, if the error was generated from a response.
|
||||
#[inline]
|
||||
pub fn status(&self) -> Option<StatusCode> {
|
||||
match self.kind {
|
||||
match self.inner.kind {
|
||||
Kind::ClientError(code) |
|
||||
Kind::ServerError(code) => Some(code),
|
||||
_ => None,
|
||||
@@ -192,13 +206,19 @@ impl Error {
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for Error {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
fmt::Debug::fmt(&self.inner, f)
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for Error {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
if let Some(ref url) = self.url {
|
||||
if let Some(ref url) = self.inner.url {
|
||||
try!(fmt::Display::fmt(url, f));
|
||||
try!(f.write_str(": "));
|
||||
}
|
||||
match self.kind {
|
||||
match self.inner.kind {
|
||||
Kind::Http(ref e) => fmt::Display::fmt(e, f),
|
||||
Kind::Hyper(ref e) => fmt::Display::fmt(e, f),
|
||||
Kind::Mime(ref e) => fmt::Display::fmt(e, f),
|
||||
@@ -224,7 +244,7 @@ impl fmt::Display for Error {
|
||||
|
||||
impl StdError for Error {
|
||||
fn description(&self) -> &str {
|
||||
match self.kind {
|
||||
match self.inner.kind {
|
||||
Kind::Http(ref e) => e.description(),
|
||||
Kind::Hyper(ref e) => e.description(),
|
||||
Kind::Mime(ref e) => e.description(),
|
||||
@@ -242,7 +262,7 @@ impl StdError for Error {
|
||||
}
|
||||
|
||||
fn cause(&self) -> Option<&StdError> {
|
||||
match self.kind {
|
||||
match self.inner.kind {
|
||||
Kind::Http(ref e) => e.cause(),
|
||||
Kind::Hyper(ref e) => e.cause(),
|
||||
Kind::Mime(ref e) => e.cause(),
|
||||
@@ -373,10 +393,7 @@ where
|
||||
{
|
||||
#[inline]
|
||||
fn from(other: InternalFrom<T>) -> Error {
|
||||
Error {
|
||||
kind: other.0.into(),
|
||||
url: other.1,
|
||||
}
|
||||
Error::new(other.0.into(), other.1)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -388,7 +405,7 @@ where
|
||||
}
|
||||
|
||||
pub(crate) fn into_io(e: Error) -> io::Error {
|
||||
match e.kind {
|
||||
match e.inner.kind {
|
||||
Kind::Io(io) => io,
|
||||
_ => io::Error::new(io::ErrorKind::Other, e),
|
||||
}
|
||||
@@ -415,45 +432,27 @@ macro_rules! try_ {
|
||||
}
|
||||
|
||||
pub(crate) fn loop_detected(url: Url) -> Error {
|
||||
Error {
|
||||
kind: Kind::RedirectLoop,
|
||||
url: Some(url),
|
||||
}
|
||||
Error::new(Kind::RedirectLoop, Some(url))
|
||||
}
|
||||
|
||||
pub(crate) fn too_many_redirects(url: Url) -> Error {
|
||||
Error {
|
||||
kind: Kind::TooManyRedirects,
|
||||
url: Some(url),
|
||||
}
|
||||
Error::new(Kind::TooManyRedirects, Some(url))
|
||||
}
|
||||
|
||||
pub(crate) fn timedout(url: Option<Url>) -> Error {
|
||||
Error {
|
||||
kind: Kind::Io(io_timeout()),
|
||||
url: url,
|
||||
}
|
||||
Error::new(Kind::Io(io_timeout()), url)
|
||||
}
|
||||
|
||||
pub(crate) fn client_error(url: Url, status: StatusCode) -> Error {
|
||||
Error {
|
||||
kind: Kind::ClientError(status),
|
||||
url: Some(url),
|
||||
}
|
||||
Error::new(Kind::ClientError(status), Some(url))
|
||||
}
|
||||
|
||||
pub(crate) fn server_error(url: Url, status: StatusCode) -> Error {
|
||||
Error {
|
||||
kind: Kind::ServerError(status),
|
||||
url: Some(url),
|
||||
}
|
||||
Error::new(Kind::ServerError(status), Some(url))
|
||||
}
|
||||
|
||||
pub(crate) fn url_bad_scheme(url: Url) -> Error {
|
||||
Error {
|
||||
kind: Kind::UrlBadScheme,
|
||||
url: Some(url),
|
||||
}
|
||||
Error::new(Kind::UrlBadScheme, Some(url))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
@@ -494,7 +493,7 @@ mod tests {
|
||||
|
||||
let root = Chain(None::<Error>);
|
||||
let io = ::std::io::Error::new(::std::io::ErrorKind::Other, root);
|
||||
let err = Error { kind: Kind::Io(io), url: None };
|
||||
let err = Error::new(Kind::Io(io), None);
|
||||
assert!(err.cause().is_none());
|
||||
assert_eq!(err.to_string(), "root");
|
||||
|
||||
@@ -502,8 +501,14 @@ mod tests {
|
||||
let root = ::std::io::Error::new(::std::io::ErrorKind::Other, Chain(None::<Error>));
|
||||
let link = Chain(Some(root));
|
||||
let io = ::std::io::Error::new(::std::io::ErrorKind::Other, link);
|
||||
let err = Error { kind: Kind::Io(io), url: None };
|
||||
let err = Error::new(Kind::Io(io), None);
|
||||
assert!(err.cause().is_some());
|
||||
assert_eq!(err.to_string(), "chain: root");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn mem_size_of() {
|
||||
use std::mem::size_of;
|
||||
assert_eq!(size_of::<Error>(), size_of::<usize>());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user