Documentation
use crate::packet::TpduSize;
use num_enum::TryFromPrimitiveError;
use std::io;
use thiserror::Error;
use tpkt::ToTpktError;

#[derive(Debug, Error)]
pub enum Error {
    #[error(transparent)]
    IoErr(#[from] io::Error),

    #[error("Error: {0}")]
    Error(String),
}

pub type Result<T> = std::result::Result<T, Error>;

pub trait ToCoptError {
    fn to_err(self) -> Error;
}

impl<T: ToCoptError> From<T> for Error {
    fn from(value: T) -> Self {
        value.to_err()
    }
}

impl ToTpktError for Error {
    fn to_err(self) -> tpkt::Error {
        tpkt::Error::Error(self.to_string())
    }
}

impl From<TryFromPrimitiveError<TpduSize>> for Error {
    fn from(value: TryFromPrimitiveError<TpduSize>) -> Self {
        Self::Error(value.to_string())
    }
}