use super::lifecycle_phase::LifecyclePhase;
use crate::TranscodeFailure;
#[derive(Debug, Default)]
pub(crate) struct LifecycleGuard {
phase: LifecyclePhase,
}
impl LifecycleGuard {
#[inline]
#[must_use]
pub(crate) const fn new() -> Self {
Self {
phase: LifecyclePhase::Uninitialized,
}
}
#[inline]
pub(crate) fn on_reset_start(&mut self) {
self.phase = LifecyclePhase::Poisoned;
}
#[inline]
pub(crate) fn on_reset_success(&mut self) {
self.phase = LifecyclePhase::Fresh;
}
#[inline]
pub(crate) fn on_transcode(&mut self) -> Result<(), TranscodeFailure> {
match self.phase {
LifecyclePhase::Uninitialized => {
return Err(TranscodeFailure::TranscodeBeforeReset);
}
LifecyclePhase::Finished => {
return Err(TranscodeFailure::TranscodeAfterFinish);
}
LifecyclePhase::Poisoned => {
return Err(TranscodeFailure::LifecyclePoisoned);
}
LifecyclePhase::Fresh | LifecyclePhase::Streaming => {}
}
if self.phase == LifecyclePhase::Fresh {
self.phase = LifecyclePhase::Streaming;
}
Ok(())
}
#[inline]
pub(crate) fn on_finish_attempt(&self) -> Result<(), TranscodeFailure> {
match self.phase {
LifecyclePhase::Uninitialized => {
return Err(TranscodeFailure::FinishBeforeReset);
}
LifecyclePhase::Finished => {
return Err(TranscodeFailure::FinishAfterFinish);
}
LifecyclePhase::Poisoned => {
return Err(TranscodeFailure::LifecyclePoisoned);
}
LifecyclePhase::Fresh | LifecyclePhase::Streaming => {}
}
Ok(())
}
#[inline]
pub(crate) fn on_finish_start(&mut self) {
self.phase = LifecyclePhase::Poisoned;
}
#[inline]
pub(crate) fn on_finish_success(&mut self) {
self.phase = LifecyclePhase::Finished;
}
}