use core::error::Error;
use serde::{Deserialize, Serialize};
use tokio::io::{self, AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
use crate::{event::OverlayEvent, request::Request};
pub fn create_ipc_addr(pid: u32, module_handle: u32) -> String {
format!("\\\\.\\pipe\\asdf-overlay-{pid}-{module_handle}")
}
#[derive(Serialize, Deserialize)]
pub struct ClientRequest {
pub id: u32,
pub req: Request,
}
#[derive(Serialize, Deserialize)]
pub enum ResponseResult<T> {
Ok(T),
Err(String),
}
impl<E: Error, T> From<E> for ResponseResult<T> {
fn from(err: E) -> Self {
ResponseResult::Err(err.to_string())
}
}
#[derive(Debug, Serialize, Deserialize)]
pub enum ServerToClientPacket {
Response { id: u32, payload: Vec<u8> },
Event(OverlayEvent),
}
#[derive(Debug, Clone, Copy)]
pub struct Frame {
pub size: u32,
}
impl Frame {
pub async fn read(mut r: impl AsyncRead + Unpin) -> io::Result<Self> {
Ok(Self {
size: r.read_u32().await?,
})
}
pub async fn write(self, mut w: impl AsyncWrite + Unpin) -> io::Result<()> {
w.write_u32(self.size).await?;
Ok(())
}
}