somnytoo 2.0.0

Binary protocol server for secure communications
Documentation
use std::time::Duration;
use tokio::io::AsyncWriteExt;
use tokio::time::timeout;

use crate::core::protocol::error::{ProtocolResult, ProtocolError};

pub async fn write_frame<W: AsyncWriteExt + Unpin + ?Sized>(
                                                              writer: &mut W,
                                                              data: &[u8],
) -> ProtocolResult<()> {
    let header = (data.len() as u32).to_be_bytes();

    match timeout(Duration::from_secs(5), writer.write_all(&header)).await {
        Ok(result) => match result {
            Ok(_) => {},
            Err(e) => return Err(ProtocolError::MalformedPacket {
                details: format!("IO error: {}", e)
            }),
        },
        Err(_) => return Err(ProtocolError::Timeout {
            duration: Duration::from_secs(5)
        }),
    }

    match timeout(Duration::from_secs(5), writer.write_all(data)).await {
        Ok(result) => match result {
            Ok(_) => {},
            Err(e) => return Err(ProtocolError::MalformedPacket {
                details: format!("IO error: {}", e)
            }),
        },
        Err(_) => return Err(ProtocolError::Timeout {
            duration: Duration::from_secs(5)
        }),
    }

    match timeout(Duration::from_secs(5), writer.flush()).await {
        Ok(result) => match result {
            Ok(_) => {},
            Err(e) => return Err(ProtocolError::MalformedPacket {
                details: format!("IO error: {}", e)
            }),
        },
        Err(_) => return Err(ProtocolError::Timeout {
            duration: Duration::from_secs(5)
        }),
    }
    Ok(())
}