use crate::resolver::ResolverError; use miette::Diagnostic; use smol_str::SmolStr; use thiserror::Error; #[derive(Debug, Diagnostic, Error)] pub enum BackfillError { #[error("{0}")] Generic(miette::Report), #[error("too many requests")] Ratelimited, #[error("pds is throttled")] PreemptivelyThrottled, #[error("pds endpoint is permanently unsafe: {0}")] UnsafeEndpoint(SmolStr), #[error("pds backfill slots are busy")] PdsBusy, #[error("transport error: {0}")] Transport(SmolStr), #[error("repo was concurrently deleted")] Deleted, #[error("getRepo returned RepoNotFound")] RepoNotFound, } impl From for BackfillError { fn from(e: miette::Report) -> Self { Self::Generic(e) } } impl From for BackfillError { fn from(e: ResolverError) -> Self { match e { ResolverError::Ratelimited => Self::Ratelimited, ResolverError::Transport(s) => Self::Transport(s), ResolverError::HandleResolutionExhausted(e) | ResolverError::Generic(e) => { Self::Generic(e) } error @ (ResolverError::MissingPds(_) | ResolverError::NotFound(_) | ResolverError::NoSigningKey(_)) => Self::Generic(error.into()), } } } #[cfg(test)] mod tests { use super::*; #[test] fn exhausted_handle_resolution_is_not_a_backfill_transport_failure() { let error = BackfillError::from(ResolverError::HandleResolutionExhausted(miette::miette!( "handle not found" ))); assert!(matches!(error, BackfillError::Generic(_))); } }