use crate::Error;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CompletionErrorKind {
Transport,
Backend,
MalformedResponse,
EmptyReply,
Disabled,
Config,
}
#[derive(Debug)]
#[non_exhaustive]
pub struct CompletionError {
inner: Error,
}
impl CompletionError {
#[must_use]
pub fn kind(&self) -> CompletionErrorKind {
match &self.inner {
Error::Http(_) | Error::BackendBodyRead { .. } => CompletionErrorKind::Transport,
Error::Backend { .. } => CompletionErrorKind::Backend,
Error::MalformedResponse(_) | Error::MalformedResponseSource { .. } => {
CompletionErrorKind::MalformedResponse
}
Error::EmptyModelReply { .. } => CompletionErrorKind::EmptyReply,
Error::GatewayDisabled => CompletionErrorKind::Disabled,
_ => CompletionErrorKind::Config,
}
}
#[must_use]
pub fn backend_body(&self) -> Option<&str> {
match &self.inner {
Error::Backend { body, .. } => Some(body),
_ => None,
}
}
#[must_use]
pub fn status(&self) -> Option<u16> {
match &self.inner {
Error::Backend { status, .. } | Error::BackendBodyRead { status, .. } => Some(*status),
_ => None,
}
}
#[must_use]
pub fn is_timeout(&self) -> bool {
match &self.inner {
Error::Http(source) | Error::BackendBodyRead { source, .. } => source
.downcast_ref::<reqwest::Error>()
.is_some_and(reqwest::Error::is_timeout),
_ => false,
}
}
#[must_use]
pub fn is_retryable(&self) -> bool {
match &self.inner {
Error::Http(_)
| Error::MalformedResponse(_)
| Error::MalformedResponseSource { .. }
| Error::BackendBodyRead { .. } => true,
Error::Backend { status, .. } => *status >= 500,
_ => false,
}
}
}
impl std::fmt::Display for CompletionError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.inner)
}
}
impl std::error::Error for CompletionError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
std::error::Error::source(&self.inner)
}
}
impl From<Error> for CompletionError {
fn from(inner: Error) -> Self {
CompletionError { inner }
}
}
impl From<CompletionError> for Error {
fn from(error: CompletionError) -> Self {
error.inner
}
}