use crate::types::{OutputState, DisplayRotation, HdrState, HdrMode, DisplayId, Extent2D, Point2D};
use crate::error::DisplayResult;
use async_trait::async_trait;
pub trait OutputEditable {
fn set_rotation(&mut self, rotation: DisplayRotation) -> DisplayResult<&mut dyn OutputEditable>;
fn set_resolution(&mut self, extent: Extent2D) -> DisplayResult<&mut dyn OutputEditable>;
fn set_position(&mut self, position: Point2D) -> DisplayResult<&mut dyn OutputEditable>;
fn set_refresh_rate(&mut self, rate: u32) -> DisplayResult<&mut dyn OutputEditable>;
fn set_primary(&mut self) -> DisplayResult<&mut dyn OutputEditable>;
fn set_hdr(&mut self, state: HdrState, mode: HdrMode) -> DisplayResult<&mut dyn OutputEditable>;
fn set_scale(&mut self, scale: f64) -> DisplayResult<&mut dyn OutputEditable>;
fn set_enabled(&mut self, enabled: bool) -> DisplayResult<&mut dyn OutputEditable>;
fn clone_from(&mut self, source_id: &DisplayId) -> DisplayResult<&mut dyn OutputEditable>;
fn get_state(&self) -> OutputState;
}
#[async_trait]
pub trait UniversalTopology: Sized + Send + Sync {
fn acquire() -> DisplayResult<Self>;
fn get_outputs(&self) -> Vec<OutputState>;
fn edit_output(&mut self, id: &DisplayId) -> DisplayResult<Box<dyn OutputEditable + '_>>;
fn set_persistence(&mut self, enabled: bool) -> &mut Self;
async fn validate(&self) -> DisplayResult<()>;
async fn commit(&mut self) -> DisplayResult<()>;
}