|
pub use crate::dispatcher::*; |
|
use crate::messages::prelude::*; |
|
|
|
|
|
|
|
|
|
pub trait MessageHandler<M: ToDiscriminant, D> |
|
where |
|
M::Discriminant: AsMessage, |
|
<M::Discriminant as TransitiveChild>::TopParent: TransitiveChild<Parent = <M::Discriminant as TransitiveChild>::TopParent, TopParent = <M::Discriminant as TransitiveChild>::TopParent> + AsMessage, |
|
{ |
|
|
|
fn process_message(&mut self, message: M, responses: &mut VecDeque<Message>, data: D); |
|
|
|
fn actions(&self) -> ActionList; |
|
} |
|
|
|
pub type ActionList = Vec<Vec<MessageDiscriminant>>; |
|
|
|
pub trait AsMessage: TransitiveChild |
|
where |
|
Self::TopParent: TransitiveChild<Parent = Self::TopParent, TopParent = Self::TopParent> + AsMessage, |
|
{ |
|
fn local_name(self) -> String; |
|
fn global_name(self) -> String { |
|
<Self as Into<Self::TopParent>>::into(self).local_name() |
|
} |
|
} |
|
|
|
|
|
|
|
pub trait MessageHandlerData {} |
|
|
|
pub trait ToDiscriminant { |
|
type Discriminant; |
|
|
|
fn to_discriminant(&self) -> Self::Discriminant; |
|
} |
|
|
|
pub trait TransitiveChild: Into<Self::Parent> + Into<Self::TopParent> { |
|
type TopParent; |
|
type Parent; |
|
} |
|
|
|
pub trait Hint { |
|
fn hints(&self) -> HashMap<String, String>; |
|
} |
|
|