use thiserror::Error as ThisError;
use crate::api::ApiError;
#[cfg(feature = "compute_api_v2")]
use crate::api::{
compute::error::ComputeError, locks::error::LocksError, metadata::error::MetadataError,
restrict::error::RestrictError,
};
pub type Result<T> = std::result::Result<T, SeaplaneError>;
#[derive(ThisError, Debug)]
pub enum SeaplaneError {
#[error("{0}")]
ApiResponse(#[from] ApiError),
#[error("http error: {0}")]
UnknownHttp(reqwest::Error),
#[error("{0}")]
UnknownRequest(reqwest::Error),
#[error("request did not include a required API key")]
MissingRequestApiKey,
#[error("request did not include a required authorization token")]
MissingRequestAuthToken,
#[error("invalid URL")]
UrlParse(#[from] url::ParseError),
#[error("{0}")]
Json(#[from] serde_json::error::Error),
#[cfg(feature = "compute_api_v2")]
#[error("{0}")]
ComputeRequest(#[from] ComputeError),
#[cfg(feature = "locks_api_v1")]
#[error("{0}")]
LocksRequest(#[from] LocksError),
#[cfg(feature = "metadata_api_v1")]
#[error("{0}")]
MetadataRequest(#[from] MetadataError),
#[cfg(feature = "restrict_api_v1")]
#[error("{0}")]
RestrictRequest(#[from] RestrictError),
}
impl From<reqwest::Error> for SeaplaneError {
fn from(e: reqwest::Error) -> Self {
if e.is_builder() {
SeaplaneError::UnknownRequest(e)
} else {
SeaplaneError::UnknownHttp(e)
}
}
}
impl PartialEq for SeaplaneError {
fn eq(&self, rhs: &Self) -> bool {
use SeaplaneError::*;
match self {
UnknownHttp(_) => matches!(rhs, UnknownHttp(_)),
UnknownRequest(_) => matches!(rhs, UnknownRequest(_)),
MissingRequestApiKey => matches!(rhs, MissingRequestApiKey),
MissingRequestAuthToken => matches!(rhs, MissingRequestAuthToken),
UrlParse(_) => matches!(rhs, UrlParse(_)),
Json(_) => matches!(rhs, Json(_)),
ApiResponse(ae) => match rhs {
ApiResponse(oae) => ae == oae,
_ => false,
},
#[cfg(feature = "compute_api_v2")]
ComputeRequest(e) => {
if let ComputeRequest(re) = rhs {
e == re
} else {
false
}
}
#[cfg(feature = "locks_api_v1")]
LocksRequest(e) => {
if let LocksRequest(re) = rhs {
e == re
} else {
false
}
}
#[cfg(feature = "metadata_api_v1")]
MetadataRequest(e) => {
if let MetadataRequest(re) = rhs {
e == re
} else {
false
}
}
#[cfg(feature = "restrict_api_v1")]
RestrictRequest(e) => {
if let RestrictRequest(re) = rhs {
e == re
} else {
false
}
}
}
}
}