use std::error::Error;
use bytes::Bytes;
use snafu::prelude::*;
#[derive(Debug, Snafu)]
#[snafu(visibility(pub))]
#[non_exhaustive]
pub enum ApiError<E>
where
E: Error + Send + Sync + 'static,
{
#[snafu(display("client error: {}", source))]
Client {
source: E,
},
#[snafu(context(false), display("failed to parse url: {}", source))]
UrlParse {
source: url::ParseError,
},
#[snafu(context(false), display("failed to parse uri: {}", source))]
UriParse {
source: http::uri::InvalidUri,
},
#[snafu(context(false), display("could not parse JSON response: {}", source))]
Json {
source: serde_json::Error,
},
#[snafu(display("opentalk server error: {}", msg))]
OpenTalk {
msg: String,
},
#[snafu(display("opentalk internal server error {}", status))]
OpenTalkService {
status: http::StatusCode,
data: Bytes,
},
#[snafu(display("could not parse {} data from JSON: {}", typename, source))]
DataType {
source: serde_json::Error,
typename: &'static str,
},
#[snafu(
context(false),
display("error in http-request-derive crate: {}", source)
)]
HttpRequestDerive {
source: http_request_derive::Error,
},
#[snafu(context(false), display("could not build HTTP request: {}", source))]
Request {
source: http::Error,
},
#[snafu(display("trying to perfom an unauthorized request"))]
Unauthorized,
#[snafu(whatever)]
Custom {
message: String,
#[snafu(source(from(Box<dyn Error + Send + Sync>, Some)))]
source: Option<Box<dyn Error + Send + Sync>>,
},
}