pub mod surface;
pub mod window;
use core::fmt;
use serde::{Deserialize, Serialize, de::DeserializeOwned};
use crate::{
cursor::Cursor,
request::{surface::SurfaceRequest, window::WindowRequest},
};
#[derive(Debug, Clone, derive_more::From, Serialize, Deserialize)]
pub enum Request {
BlockInput(BlockInput),
SetBlockingCursor(SetBlockingCursor),
Window(WindowRequest),
Surface(SurfaceRequest),
}
pub type Result<T> = core::result::Result<T, Error>;
#[derive(Debug, Serialize, Deserialize)]
#[serde(transparent)]
pub struct Error(serde_error::Error);
impl Error {
pub fn new(error: &(impl ?Sized + core::error::Error)) -> Self {
Self(serde_error::Error::new(error))
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
}
impl core::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
self.0.source()
}
}
pub trait Requestable: Into<Request> + Serialize + DeserializeOwned {
type Response: Serialize + DeserializeOwned;
}
macro_rules! impl_Requestable {
($request_ty:ty, $response_ty:ty) => {
impl $crate::request::Requestable for $request_ty {
type Response = $response_ty;
}
};
}
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
pub struct BlockInput {
pub block: bool,
}
impl_Requestable!(BlockInput, ());
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
pub struct SetBlockingCursor {
pub cursor: Option<Cursor>,
}
impl_Requestable!(SetBlockingCursor, ());