use {
crate::{
error::RequestError,
monitor::BackendMonitor,
settings::WindowSettings,
window::BackendWindow,
},
std::{
collections::VecDeque,
sync::Arc,
},
};
pub trait Backend: Send + Sync {
fn instance() -> Option<&'static Self>
where
Self: Sized + 'static,
{
None
}
fn backend() -> Option<&'static dyn Backend>
where
Self: Sized + 'static,
{
Self::instance().map(|b| b as _)
}
fn is_available() -> bool
where
Self: Sized,
{
false
}
fn name(&self) -> &'static str;
fn create_window(&self, settings: WindowSettings) -> Result<Arc<dyn BackendWindow>, RequestError> {
let _ = settings;
Err(RequestError::not_supported(format!("`{}` backend is not available to create a window", self.name())))
}
fn list_available_monitors(&self) -> Result<VecDeque<Arc<dyn BackendMonitor>>, RequestError> {
Err(RequestError::not_supported(format!(
"`{}` backend is not available to list available monitors",
self.name()
)))
}
fn primary_monitor(&self) -> Result<Arc<dyn BackendMonitor>, RequestError> {
Err(RequestError::not_supported(format!(
"`{}` backend is not available to get the primary monitor",
self.name()
)))
}
}