mirror of
https://codeberg.org/unspeaker/tengri.git
synced 2025-12-06 03:36:42 +01:00
feat(input): add def_command
This commit is contained in:
parent
022bfa3e20
commit
375b959e33
1 changed files with 22 additions and 5 deletions
|
|
@ -26,8 +26,8 @@ flex_trait_mut!(Handle <E: Input> {
|
||||||
});
|
});
|
||||||
|
|
||||||
pub trait Command<S>: Send + Sync + Sized {
|
pub trait Command<S>: Send + Sync + Sized {
|
||||||
fn execute (self, state: &mut S) -> Perhaps<Self>;
|
fn execute (&self, state: &mut S) -> Perhaps<Self>;
|
||||||
fn delegate <T> (self, state: &mut S, wrap: impl Fn(Self)->T) -> Perhaps<T>
|
fn delegate <T> (&self, state: &mut S, wrap: impl Fn(Self)->T) -> Perhaps<T>
|
||||||
where Self: Sized
|
where Self: Sized
|
||||||
{
|
{
|
||||||
Ok(self.execute(state)?.map(wrap))
|
Ok(self.execute(state)?.map(wrap))
|
||||||
|
|
@ -35,10 +35,10 @@ pub trait Command<S>: Send + Sync + Sized {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<S, T: Command<S>> Command<S> for Option<T> {
|
impl<S, T: Command<S>> Command<S> for Option<T> {
|
||||||
fn execute (self, _: &mut S) -> Perhaps<Self> {
|
fn execute (&self, _: &mut S) -> Perhaps<Self> {
|
||||||
Ok(None)
|
Ok(None)
|
||||||
}
|
}
|
||||||
fn delegate <U> (self, _: &mut S, _: impl Fn(Self)->U) -> Perhaps<U>
|
fn delegate <U> (&self, _: &mut S, _: impl Fn(Self)->U) -> Perhaps<U>
|
||||||
where Self: Sized
|
where Self: Sized
|
||||||
{
|
{
|
||||||
Ok(None)
|
Ok(None)
|
||||||
|
|
@ -49,13 +49,30 @@ impl<S, T: Command<S>> Command<S> for Option<T> {
|
||||||
#[macro_export] macro_rules! command {
|
#[macro_export] macro_rules! command {
|
||||||
($(<$($l:lifetime),+>)?|$self:ident:$Command:ty,$state:ident:$State:ty|$handler:expr) => {
|
($(<$($l:lifetime),+>)?|$self:ident:$Command:ty,$state:ident:$State:ty|$handler:expr) => {
|
||||||
impl$(<$($l),+>)? ::tengri::input::Command<$State> for $Command {
|
impl$(<$($l),+>)? ::tengri::input::Command<$State> for $Command {
|
||||||
fn execute ($self, $state: &mut $State) -> Perhaps<Self> {
|
fn execute (&$self, $state: &mut $State) -> Perhaps<Self> {
|
||||||
Ok($handler)
|
Ok($handler)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[macro_export] macro_rules! def_command (($Command:ident: |$state:ident: $State:ty| {
|
||||||
|
$($Variant:ident$({$($arg:ident:$Arg:ty),+ $(,)?})?=>$body:expr),* $(,)?
|
||||||
|
})=>{
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum $Command {
|
||||||
|
$($Variant $({ $($arg: $Arg),* })?),*
|
||||||
|
}
|
||||||
|
impl Command<$State> for $Command {
|
||||||
|
fn execute (&self, $state: &mut $State) -> Perhaps<Self> {
|
||||||
|
match self {
|
||||||
|
$(Self::$Variant $({ $($arg),* })? => $body,)*
|
||||||
|
_ => unimplemented!("Command<{}>: {self:?}", stringify!($State)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
/// Implement [Handle] for given `State` and `handler`.
|
/// Implement [Handle] for given `State` and `handler`.
|
||||||
#[macro_export] macro_rules! handle {
|
#[macro_export] macro_rules! handle {
|
||||||
(|$self:ident:$State:ty,$input:ident|$handler:expr) => {
|
(|$self:ident:$State:ty,$input:ident|$handler:expr) => {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue