use thiserror::Error;
use crate::{ProviderFailure, ProviderName};
#[derive(Debug, Clone, Error)]
pub enum ProviderRegistryError {
#[error("provider name must not be empty")]
EmptyProviderName,
#[error("invalid provider name '{name}': {reason}")]
InvalidProviderName {
name: String,
reason: String,
},
#[error("duplicate provider name: {name}")]
DuplicateProviderName {
name: ProviderName,
},
#[error("unknown provider: {name}")]
UnknownProvider {
name: ProviderName,
},
#[error("provider '{name}' is unavailable: {}", .source.reason())]
ProviderUnavailable {
name: ProviderName,
#[source]
source: crate::ProviderCreateError,
},
#[error("provider '{name}' failed to create service: {}", .source.reason())]
ProviderCreate {
name: ProviderName,
#[source]
source: crate::ProviderCreateError,
},
#[error(
"no available provider; candidate failures: {}",
format_provider_failures(.failures)
)]
NoAvailableProvider {
failures: Vec<ProviderFailure>,
},
#[error("provider registry is empty")]
EmptyRegistry,
}
fn format_provider_failures(failures: &[ProviderFailure]) -> String {
failures
.iter()
.map(ToString::to_string)
.collect::<Vec<_>>()
.join("; ")
}