mirror of
https://codeberg.org/unspeaker/tengri.git
synced 2025-12-07 04:06:48 +01:00
41 lines
1 KiB
Rust
41 lines
1 KiB
Rust
use crate::*;
|
|
|
|
/// Event source
|
|
pub trait Input: Sized {
|
|
/// Type of input event
|
|
type Event;
|
|
/// Result of handling input
|
|
type Handled; // TODO: make this an Option<Box dyn Command<Self>> containing the undo
|
|
/// Currently handled event
|
|
fn event (&self) -> &Self::Event;
|
|
/// Whether component should exit
|
|
fn is_done (&self) -> bool;
|
|
/// Mark component as done
|
|
fn done (&self);
|
|
}
|
|
|
|
flex_trait_mut!(Handle <E: Input> {
|
|
fn handle (&mut self, _input: &E) -> Perhaps<E::Handled> {
|
|
Ok(None)
|
|
}
|
|
});
|
|
|
|
pub trait Command<S>: Send + Sync + Sized {
|
|
fn execute (self, state: &mut S) -> Perhaps<Self>;
|
|
fn delegate <T> (self, state: &mut S, wrap: impl Fn(Self)->T) -> Perhaps<T>
|
|
where Self: Sized
|
|
{
|
|
Ok(self.execute(state)?.map(wrap))
|
|
}
|
|
}
|
|
|
|
impl<S, T: Command<S>> Command<S> for Option<T> {
|
|
fn execute (self, _: &mut S) -> Perhaps<Self> {
|
|
Ok(None)
|
|
}
|
|
fn delegate <U> (self, _: &mut S, _: impl Fn(Self)->U) -> Perhaps<U>
|
|
where Self: Sized
|
|
{
|
|
Ok(None)
|
|
}
|
|
}
|