use crate::time::TimeDuration;
use palette::Srgb;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TransitionStyle {
Step,
Linear,
EaseIn,
EaseOut,
EaseInOut,
EaseOutIn,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LoopCount {
Finite(u32),
Infinite,
}
impl Default for LoopCount {
fn default() -> Self {
LoopCount::Finite(1)
}
}
#[derive(Debug, Clone, Copy)]
pub struct SequenceStep<D: TimeDuration> {
pub color: Srgb,
pub duration: D,
pub transition: TransitionStyle,
}
impl<D: TimeDuration> SequenceStep<D> {
#[inline]
pub fn new(color: Srgb, duration: D, transition: TransitionStyle) -> Self {
Self {
color,
duration,
transition,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SequenceError {
EmptySequence,
ZeroDurationWithInterpolation,
CapacityExceeded,
StartColorWithStepTransition,
LandingColorWithInfiniteLoop,
}
impl core::fmt::Display for SequenceError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
SequenceError::EmptySequence => {
write!(f, "sequence must have at least one step")
}
SequenceError::ZeroDurationWithInterpolation => {
write!(
f,
"zero-duration steps must use Step transition (interpolating transitions require non-zero duration)"
)
}
SequenceError::CapacityExceeded => {
write!(f, "sequence capacity exceeded")
}
SequenceError::StartColorWithStepTransition => {
write!(
f,
"start_color only applies when first sequence step has TransitionStyle != Step"
)
}
SequenceError::LandingColorWithInfiniteLoop => {
write!(
f,
"landing_color only applies to finite sequences (infinite loops never complete)"
)
}
}
}
}