//! Error handling and error types
use thiserror::Error;
pub use kube_core::ErrorResponse;
/// Possible errors from the [`Client`](crate::Client)
#[cfg_attr(docsrs, doc(cfg(any(feature = "config", feature = "client"))))]
#[derive(Error, Debug)]
pub enum Error {
/// ApiError for when things fail
///
/// This can be parsed into as an error handling fallback.
/// It's also used in `WatchEvent` from watch calls.
///
/// It's quite common to get a `410 Gone` when the `resourceVersion` is too old.
#[error("ApiError: {0} ({0:?})")]
Api(#[source] ErrorResponse),
/// Hyper error
#[cfg(feature = "client")]
#[error("HyperError: {0}")]
HyperError(#[source] hyper::Error),
/// Service error
#[cfg(feature = "client")]
#[error("ServiceError: {0}")]
Service(#[source] tower::BoxError),
/// UTF-8 Error
#[error("UTF-8 Error: {0}")]
FromUtf8(#[source] std::string::FromUtf8Error),
/// Returned when failed to find a newline character within max length.
/// Only returned by `Client::request_events` and this should never happen as
/// the max is `usize::MAX`.
#[error("Error finding newline character")]
LinesCodecMaxLineLengthExceeded,
/// Returned on `std::io::Error` when reading event stream.
#[error("Error reading events stream: {0}")]
ReadEvents(#[source] std::io::Error),
/// Http based error
#[error("HttpError: {0}")]
HttpError(#[source] http::Error),
/// Common error case when requesting parsing into own structs
#[error("Error deserializing response: {0}")]
SerdeError(#[source] serde_json::Error),
/// Failed to build request
#[error("Failed to build request: {0}")]
BuildRequest(#[source] kube_core::request::Error),
/// Failed to infer config
#[error("Failed to infer configuration: {0}")]
InferConfig(#[source] crate::config::InferConfigError),
/// Discovery errors
#[error("Error from discovery: {0}")]
Discovery(#[source] DiscoveryError),
/// Errors from OpenSSL TLS
#[cfg(feature = "openssl-tls")]
#[cfg_attr(docsrs, doc(cfg(feature = "openssl-tls")))]
#[error("openssl tls error: {0}")]
OpensslTls(#[source] crate::client::OpensslTlsError),
/// Errors from Rustls TLS
#[cfg(feature = "rustls-tls")]
#[cfg_attr(docsrs, doc(cfg(feature = "rustls-tls")))]
#[error("rustls tls error: {0}")]
RustlsTls(#[source] crate::client::RustlsTlsError),
/// Missing TLS stacks when TLS is required
#[error("TLS required but no TLS stack selected")]
TlsRequired,
/// Failed to upgrade to a WebSocket connection
#[cfg(feature = "ws")]
#[cfg_attr(docsrs, doc(cfg(feature = "ws")))]
#[error("failed to upgrade to a WebSocket connection: {0}")]
UpgradeConnection(#[source] crate::client::UpgradeConnectionError),
/// Errors related to client auth
#[cfg(feature = "client")]
#[cfg_attr(docsrs, doc(cfg(feature = "client")))]
#[error("auth error: {0}")]
Auth(#[source] crate::client::AuthError),
/// Error resolving resource reference
#[cfg(feature = "unstable-client")]
#[cfg_attr(docsrs, doc(cfg(feature = "unstable-client")))]
#[error("Reference resolve error: {0}")]
RefResolve(String),
}
#[derive(Error, Debug)]
/// Possible errors when using API [discovery](crate::discovery)
pub enum DiscoveryError {
/// Invalid GroupVersion
#[error("Invalid GroupVersion: {0}")]
InvalidGroupVersion(String),
/// Missing Kind
#[error("Missing Kind: {0}")]
MissingKind(String),
/// Missing ApiGroup
#[error("Missing Api Group: {0}")]
MissingApiGroup(String),
/// MissingResource
#[error("Missing Resource: {0}")]
MissingResource(String),
/// Empty ApiGroup
#[error("Empty Api Group: {0}")]
EmptyApiGroup(String),
}