Documentation
use crate::jobs::JobError;

use super::pal::OtaPalError;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
pub enum OtaError {
    NoActiveJob,
    SignalEventFailed,
    Momentum,
    MomentumAbort,
    InvalidInterface,
    ResetFailed,
    BlockOutOfRange,
    ZeroFileSize,
    Overflow,
    InvalidFile,
    Mqtt(mqttrust::MqttError),
    Encoding,
    Pal,
    Timer,
}

impl OtaError {
    pub fn is_retryable(&self) -> bool {
        matches!(self, Self::Encoding)
    }
}

impl From<mqttrust::MqttError> for OtaError {
    fn from(e: mqttrust::MqttError) -> Self {
        Self::Mqtt(e)
    }
}

impl<E: Copy> From<OtaPalError<E>> for OtaError {
    fn from(_e: OtaPalError<E>) -> Self {
        Self::Pal
    }
}

impl From<JobError> for OtaError {
    fn from(e: JobError) -> Self {
        match e {
            JobError::Overflow => Self::Overflow,
            JobError::Encoding => Self::Encoding,
            JobError::Mqtt(m) => Self::Mqtt(m),
        }
    }
}