use std::sync::Arc;
use crate::{BudgetId, Resource};
#[derive(Clone, Debug, Eq, PartialEq, thiserror::Error)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ResourceError {
#[error("resource name cannot be empty")]
EmptyName,
}
#[derive(Clone, Debug, Eq, PartialEq, thiserror::Error)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum BudgetBuildError {
#[error("duplicate limit for resource {resource}")]
DuplicateLimit {
resource: Resource,
},
#[error("deadline is outside the representable clock range")]
DeadlineOverflow,
#[error("deadline configured more than once")]
DuplicateDeadline,
#[error("process-local budget identifier space exhausted")]
BudgetIdExhausted,
}
#[derive(Clone, Debug, Eq, PartialEq, thiserror::Error)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum BudgetError {
#[error(
"resource {resource} exhausted at budget {scope}: requested {requested}, remaining {remaining}"
)]
Exhausted {
resource: Resource,
requested: u64,
remaining: u64,
scope: BudgetId,
scope_name: Option<Arc<str>>,
},
#[error("resource {resource} used {actual}, exceeding reservation {reserved} by {unaccounted}")]
ReservationExceeded {
resource: Resource,
reserved: u64,
actual: u64,
unaccounted: u64,
},
#[error("resource {resource} was not part of the reservation set")]
UnknownReservationResource {
resource: Resource,
},
#[error("resource arithmetic overflow for {resource}")]
Overflow {
resource: Resource,
},
#[error("budget deadline exceeded")]
DeadlineExceeded,
#[cfg(feature = "tokio")]
#[error("budget cancelled")]
Cancelled,
}