use bytes::Bytes;
use http::uri::InvalidUri;
use snafu::{Location, Snafu};
use url::Url;
#[derive(Debug, Snafu)]
#[snafu(visibility(pub(crate)))]
pub enum Error {
#[snafu(display("trying to perform an unauthorized request"))]
Unauthorized,
#[snafu(display("server returned a non-success http status code {status}"))]
NonSuccessStatus {
status: http::StatusCode,
data: Bytes,
},
#[snafu(display("could not build http request: {source}"))]
BuildRequest {
source: http::Error,
},
#[snafu(display("base url {url} cannot be a base"))]
UrlCannotBeABase {
url: Url,
},
#[snafu(display("couldn't parse uri"))]
ParseUri {
source: InvalidUri,
},
#[snafu(display("can't create query string: {message}"))]
QueryString {
message: String,
},
#[cfg(feature = "serde")]
#[snafu(display("couldn't build query string from serde url params"))]
SerdeUrlParams {
source: serde_url_params::Error,
},
#[cfg(feature = "serde")]
#[snafu(display("serde json error"))]
Json {
source: serde_json::Error,
},
#[snafu(display("{message}"))]
Custom {
message: String,
location: Location,
},
}
impl Error {
#[track_caller]
pub fn custom(message: String) -> Self {
let location = std::panic::Location::caller();
Error::Custom {
message,
location: Location::new(location.file(), location.line(), location.column()),
}
}
}