tcrm-task 0.4.2

Task execution unit for TCRM project
Documentation
use crate::{
    flatbuffers::{
        conversion::{FromFlatbuffers, ToFlatbuffers},
        tcrm_task_generated,
    },
    tasks::error::TaskError,
};

#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone)]
pub enum ConversionError {
    InvalidStreamSource(i8),
    InvalidTaskState(i8),
    InvalidProcessState(i8),
    InvalidProcessControlAction(i8),
    InvalidTaskTerminateReasonType(i8),
    InvalidTaskEventStopReasonType(i8),
    InvalidTaskEventType(i8),
    InvalidTaskErrorType(i8),
    InvalidSignal(i32),
    MissingRequiredField(&'static str),
    FlatBuffersError(String),
}

impl std::fmt::Display for ConversionError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            ConversionError::InvalidStreamSource(val) => {
                write!(f, "Invalid StreamSource value: {val}")
            }
            ConversionError::InvalidTaskState(val) => write!(f, "Invalid TaskState value: {val}"),
            ConversionError::InvalidProcessState(val) => {
                write!(f, "Invalid ProcessState value: {val}")
            }
            ConversionError::InvalidProcessControlAction(val) => {
                write!(f, "Invalid ProcessControlAction value: {val}")
            }
            ConversionError::InvalidTaskTerminateReasonType(val) => {
                write!(f, "Invalid TaskTerminateReasonType value: {val}")
            }
            ConversionError::InvalidTaskEventStopReasonType(val) => {
                write!(f, "Invalid TaskEventStopReasonType value: {val}")
            }
            ConversionError::InvalidTaskEventType(val) => {
                write!(f, "Invalid TaskEventType value: {val}")
            }
            ConversionError::InvalidTaskErrorType(val) => {
                write!(f, "Invalid TaskErrorType value: {val}")
            }
            ConversionError::InvalidSignal(val) => {
                write!(f, "Invalid signal number: {val}")
            }
            ConversionError::MissingRequiredField(field) => {
                write!(f, "Missing required field: {field}")
            }
            ConversionError::FlatBuffersError(msg) => {
                write!(f, "FlatBuffers error: {msg}")
            }
        }
    }
}
impl std::error::Error for ConversionError {}

impl FromFlatbuffers<tcrm_task_generated::tcrm::task::TaskError<'_>> for TaskError {
    fn from_flatbuffers(
        fb_error: tcrm_task_generated::tcrm::task::TaskError<'_>,
    ) -> Result<Self, ConversionError> {
        let kind = fb_error.kind();
        let message = fb_error.message().to_string();

        match kind {
            tcrm_task_generated::tcrm::task::TaskErrorType::IO => Ok(TaskError::IO(message)),
            tcrm_task_generated::tcrm::task::TaskErrorType::Handle => {
                Ok(TaskError::Handle(message))
            }
            tcrm_task_generated::tcrm::task::TaskErrorType::Channel => {
                Ok(TaskError::Channel(message))
            }
            tcrm_task_generated::tcrm::task::TaskErrorType::InvalidConfiguration => {
                Ok(TaskError::InvalidConfiguration(message))
            }
            tcrm_task_generated::tcrm::task::TaskErrorType::Control => {
                Ok(TaskError::Control(message))
            }
            _ => Err(ConversionError::InvalidTaskErrorType(kind.0)),
        }
    }
}

impl<'a> ToFlatbuffers<'a> for TaskError {
    type Output = flatbuffers::WIPOffset<tcrm_task_generated::tcrm::task::TaskError<'a>>;

    fn to_flatbuffers(&self, builder: &mut flatbuffers::FlatBufferBuilder<'a>) -> Self::Output {
        let message = match self {
            TaskError::IO(msg)
            | TaskError::Handle(msg)
            | TaskError::Channel(msg)
            | TaskError::InvalidConfiguration(msg)
            | TaskError::Control(msg) => msg,
        };
        let msg_offset = builder.create_string(message);

        let kind = match self {
            TaskError::IO(_) => tcrm_task_generated::tcrm::task::TaskErrorType::IO,
            TaskError::Handle(_) => tcrm_task_generated::tcrm::task::TaskErrorType::Handle,
            TaskError::Channel(_) => tcrm_task_generated::tcrm::task::TaskErrorType::Channel,
            TaskError::InvalidConfiguration(_) => {
                tcrm_task_generated::tcrm::task::TaskErrorType::InvalidConfiguration
            }
            TaskError::Control(_) => tcrm_task_generated::tcrm::task::TaskErrorType::Control,
        };

        tcrm_task_generated::tcrm::task::TaskError::create(
            builder,
            &tcrm_task_generated::tcrm::task::TaskErrorArgs {
                kind,
                message: Some(msg_offset),
            },
        )
    }
}