use std::error::Error;
use std::fmt;
pub type Result<T> = std::result::Result<T, BeakIdError>;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum BeakIdError {
MissingEpoch,
InvalidEpoch(String),
InvalidWorkerId(String),
WorkerIdOutOfRange(u16),
ClockBeforeEpoch,
TimestampOverflow(u64),
Blocked,
BackgroundSpawnFailed(String),
}
impl fmt::Display for BeakIdError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::MissingEpoch => f.write_str("BEAKID_EPOCH is required"),
Self::InvalidEpoch(value) => write!(
f,
"BEAKID_EPOCH must be an RFC 3339 UTC datetime, got {value:?}"
),
Self::InvalidWorkerId(value) => {
write!(
f,
"BEAKID_WORKER_ID must be an unsigned 16-bit integer, got {value:?}"
)
}
Self::WorkerIdOutOfRange(value) => {
write!(f, "BEAKID_WORKER_ID must fit in 10 bits, got {value}")
}
Self::ClockBeforeEpoch => f.write_str("system clock is before BEAKID_EPOCH"),
Self::TimestampOverflow(value) => {
write!(f, "timestamp window {value} exceeds the 35-bit range")
}
Self::Blocked => f.write_str("generator is blocked: virtual windows exhausted"),
Self::BackgroundSpawnFailed(value) => {
write!(f, "failed to spawn BeakId background thread: {value}")
}
}
}
}
impl Error for BeakIdError {}