use std::time::Duration;
use crate::traits;
#[derive(Debug)]
pub enum Error {
IdSegInvalid,
EpochInvalid,
SequenceInvalid,
TimestampMaxReached,
SequenceMaxReached(Duration),
TimestampError,
MutexError,
InvalidId,
TooManySegments
}
pub type Result<T> = std::result::Result<T, Error>;
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Error::IdSegInvalid => write!(
f, "id seg invalid"
),
Error::EpochInvalid => write!(
f, "epoch invalid"
),
Error::SequenceInvalid => write!(
f, "sequence invalid"
),
Error::TimestampMaxReached => write!(
f, "timestamp max reached"
),
Error::SequenceMaxReached(_) => write!(
f, "sequence max reached"
),
Error::TimestampError => write!(
f, "timestamp error"
),
Error::MutexError => write!(
f, "mutex error"
),
Error::InvalidId => write!(
f, "invalid id"
),
Error::TooManySegments => write!(
f, "too many segments"
)
}
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
None
}
}
impl From<std::time::SystemTimeError> for Error {
fn from(_: std::time::SystemTimeError) -> Error {
Error::TimestampError
}
}
impl traits::NextAvailId for Error {
fn next_avail_id(&self) -> Option<&Duration> {
match self {
Error::SequenceMaxReached(dur) => Some(dur),
_ => None
}
}
}