Add URL API to Error
Adds `without_url`, `with_url`, and `url_mut` to `Error`. Closes #297
This commit is contained in:
49
src/error.rs
49
src/error.rs
@@ -9,6 +9,10 @@ use crate::{StatusCode, Url};
|
|||||||
pub type Result<T> = std::result::Result<T, Error>;
|
pub type Result<T> = std::result::Result<T, Error>;
|
||||||
|
|
||||||
/// The Errors that may occur when processing a `Request`.
|
/// The Errors that may occur when processing a `Request`.
|
||||||
|
///
|
||||||
|
/// Note: Errors may include the full URL used to make the `Request`. If the URL
|
||||||
|
/// contains sensitive information (e.g. an API key as a query parameter), be
|
||||||
|
/// sure to remove it ([`without_url`](Error::without_url))
|
||||||
pub struct Error {
|
pub struct Error {
|
||||||
inner: Box<Inner>,
|
inner: Box<Inner>,
|
||||||
}
|
}
|
||||||
@@ -56,6 +60,28 @@ impl Error {
|
|||||||
self.inner.url.as_ref()
|
self.inner.url.as_ref()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns a mutable referene to the URL related to this error
|
||||||
|
///
|
||||||
|
/// This is useful if you need to remove sensitive information from the URL
|
||||||
|
/// (e.g. an API key in the query), but do not want to remove the URL
|
||||||
|
/// entirely.
|
||||||
|
pub fn url_mut(&mut self) -> Option<&mut Url> {
|
||||||
|
self.inner.url.as_mut()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Add a url related to this error (overwriting any existing)
|
||||||
|
pub fn with_url(mut self, url: Url) -> Self {
|
||||||
|
self.inner.url = Some(url);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Strip the related url from this error (if, for example, it contains
|
||||||
|
/// sensitive information)
|
||||||
|
pub fn without_url(mut self) -> Self {
|
||||||
|
self.inner.url = None;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if the error is from a type Builder.
|
/// Returns true if the error is from a type Builder.
|
||||||
pub fn is_builder(&self) -> bool {
|
pub fn is_builder(&self) -> bool {
|
||||||
matches!(self.inner.kind, Kind::Builder)
|
matches!(self.inner.kind, Kind::Builder)
|
||||||
@@ -128,11 +154,6 @@ impl Error {
|
|||||||
|
|
||||||
// private
|
// private
|
||||||
|
|
||||||
pub(crate) fn with_url(mut self, url: Url) -> Error {
|
|
||||||
self.inner.url = Some(url);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
pub(crate) fn into_io(self) -> io::Error {
|
pub(crate) fn into_io(self) -> io::Error {
|
||||||
io::Error::new(io::ErrorKind::Other, self)
|
io::Error::new(io::ErrorKind::Other, self)
|
||||||
@@ -158,18 +179,6 @@ impl fmt::Debug for Error {
|
|||||||
|
|
||||||
impl fmt::Display for Error {
|
impl fmt::Display for Error {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
struct ForUrl<'a>(Option<&'a Url>);
|
|
||||||
|
|
||||||
impl fmt::Display for ForUrl<'_> {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
if let Some(url) = self.0 {
|
|
||||||
write!(f, " for url ({})", url.as_str())
|
|
||||||
} else {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
match self.inner.kind {
|
match self.inner.kind {
|
||||||
Kind::Builder => f.write_str("builder error")?,
|
Kind::Builder => f.write_str("builder error")?,
|
||||||
Kind::Request => f.write_str("error sending request")?,
|
Kind::Request => f.write_str("error sending request")?,
|
||||||
@@ -187,9 +196,11 @@ impl fmt::Display for Error {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ForUrl(self.inner.url.as_ref()).fmt(f)?;
|
if let Some(url) = &self.inner.url {
|
||||||
|
write!(f, " for url ({})", url.as_str())?;
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(ref e) = self.inner.source {
|
if let Some(e) = &self.inner.source {
|
||||||
write!(f, ": {}", e)?;
|
write!(f, ": {}", e)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user