dnp3 1.6.0

Rust implementation of DNP3 (IEEE 1815) with idiomatic bindings for C, C++, .NET, and Java
Documentation
use crate::app::format::write::HeaderWriter;
use crate::master::error::TaskError;
use crate::master::promise::Promise;
use crate::master::request::ReadRequest;
use crate::master::tasks::{AppTask, ReadTask, Task};
use crate::master::ReadHandler;

pub(crate) struct SingleReadTask {
    request: ReadRequest,
    pub(crate) custom_handler: Option<Box<dyn ReadHandler>>,
    promise: Promise<Result<(), TaskError>>,
}

impl From<SingleReadTask> for Task {
    fn from(value: SingleReadTask) -> Self {
        Task::App(AppTask::Read(ReadTask::SingleRead(value)))
    }
}

impl SingleReadTask {
    pub(crate) fn new(request: ReadRequest, promise: Promise<Result<(), TaskError>>) -> Self {
        Self {
            request,
            custom_handler: None,
            promise,
        }
    }

    pub(crate) fn new_with_custom_handler(
        request: ReadRequest,
        custom_handler: Box<dyn ReadHandler>,
        promise: Promise<Result<(), TaskError>>,
    ) -> Self {
        Self {
            request,
            custom_handler: Some(custom_handler),
            promise,
        }
    }

    pub(crate) fn format(&self, writer: &mut HeaderWriter) -> Result<(), scursor::WriteError> {
        self.request.format(writer)
    }

    pub(crate) fn on_task_error(self, err: TaskError) {
        self.promise.complete(Err(err))
    }

    pub(crate) fn on_complete(self) {
        self.promise.complete(Ok(()))
    }
}