use std::error::Error;
use std::fmt;
use std::time::Duration;
#[derive(Debug, Clone, PartialEq)]
pub enum BuilderError {
MissingRequiredField(&'static str),
InvalidValue {
field: &'static str,
reason: String,
},
DurationTooLarge {
field: &'static str,
duration: Duration,
},
InvalidUpidLength {
expected: usize,
actual: usize,
},
InvalidComponentCount {
max: usize,
actual: usize,
},
}
impl fmt::Display for BuilderError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
BuilderError::MissingRequiredField(field) => {
write!(f, "Required field '{}' is missing", field)
}
BuilderError::InvalidValue { field, reason } => {
write!(f, "Invalid value for field '{}': {}", field, reason)
}
BuilderError::DurationTooLarge { field, duration } => write!(
f,
"Duration for field '{}' is too large: {:?} exceeds 33-bit PTS limit",
field, duration
),
BuilderError::InvalidUpidLength { expected, actual } => write!(
f,
"Invalid UPID length: expected {} bytes, got {}",
expected, actual
),
BuilderError::InvalidComponentCount { max, actual } => {
write!(f, "Too many components: maximum {}, got {}", max, actual)
}
}
}
}
impl Error for BuilderError {}
pub type BuilderResult<T> = Result<T, BuilderError>;
pub(crate) trait DurationExt {
fn to_pts_ticks(&self) -> u64;
}
impl DurationExt for Duration {
fn to_pts_ticks(&self) -> u64 {
self.as_secs() * 90_000 + (self.subsec_nanos() as u64 * 90_000 / 1_000_000_000)
}
}