use std::error::Error;
use std::time::SystemTime;
use crate::id::{EffectId, WorkerId};
use crate::state::InvalidTransition;
#[derive(Debug, thiserror::Error)]
#[non_exhaustive]
pub enum StoreError {
#[error("effect {0} not found")]
NotFound(EffectId),
#[error(transparent)]
InvalidTransition(#[from] InvalidTransition),
#[error("effect changed concurrently: expected version {expected}, found {actual}")]
VersionConflict {
expected: u64,
actual: u64,
},
#[error("lease is held by {owner} until {expires_at:?}")]
LeaseHeld {
owner: WorkerId,
expires_at: SystemTime,
},
#[error("lease lost: it expired or another worker took over")]
LeaseLost,
#[error("store backend error: {0}")]
Backend(#[source] Box<dyn Error + Send + Sync>),
}
impl StoreError {
pub fn backend(error: impl Into<Box<dyn Error + Send + Sync>>) -> Self {
Self::Backend(error.into())
}
}