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::app::parse::parser::Response;
use crate::app::FunctionCode;
use crate::master::promise::Promise;
use crate::master::tasks::{AppTask, NonReadTask, Task};
use crate::master::{Headers, TaskError, WriteError};

pub(crate) struct EmptyResponseTask {
    function: FunctionCode,
    headers: Headers,
    promise: Promise<Result<(), WriteError>>,
}

impl From<EmptyResponseTask> for Task {
    fn from(value: EmptyResponseTask) -> Self {
        Task::App(AppTask::NonRead(NonReadTask::EmptyResponseTask(value)))
    }
}

impl EmptyResponseTask {
    pub(crate) fn new(
        function: FunctionCode,
        headers: Headers,
        promise: Promise<Result<(), WriteError>>,
    ) -> Self {
        Self {
            function,
            headers,
            promise,
        }
    }

    pub(crate) const fn function(&self) -> FunctionCode {
        self.function
    }

    pub(crate) fn write(&self, writer: &mut HeaderWriter) -> Result<(), TaskError> {
        self.headers.write(writer)
    }

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

    pub(crate) fn handle(self, response: Response) -> Result<Option<NonReadTask>, TaskError> {
        if !response.raw_objects.is_empty() {
            self.promise
                .complete(Err(WriteError::Task(TaskError::UnexpectedResponseHeaders)));
            return Err(TaskError::UnexpectedResponseHeaders);
        }

        self.promise.complete(Ok(()));

        Ok(None)
    }
}