1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
/// Error type that will be returned if an error during the message polling or pushing occurred.
/// It will indicate what the cause for the error was and return the original message in the push
/// case.
#[derive(Debug)]
#[non_exhaustive]
pub enum MessageError<T> {
/// Will be returned if the state is not active. If it originated during a push, the rejected messaged will be returned with the error.
StateIsNotActive(T),
}
pub mod __protected {
use crate::message::MessageError;
use crate::__protected::StateMachine;
use crate::{ReturnMessage, ReceiveMessage, State};
/// The PushMessage trait implementation will be generated by the add_message! macro and is used
/// to send messages into the state machine where they will then be forwarded to the correct
/// state.
pub trait PushMessage<TargetState, Message>: StateMachine
where TargetState: State + ReceiveMessage<Message>
{
/// This will call the receive_message function of ``` FooState ``` if it implemented the ReceiveMessage
/// trait for message 'FooMessage' and it has been declared to do so with the add_message! macro.
///```ignore
/// use sfsm_base::PushMessage;
/// let some_message = 2u32;
/// PushMessage::<FooState, FooMessage>::push_message(&mut sfsm, some_message);
///```
fn push_message(&mut self, message: Message) -> Result<(), MessageError<Message>>;
}
/// The PollMessage trait implementation will be generated by the add_message! macro and is used
/// to return messages from states.
pub trait PollMessage<TargetState, Message>: StateMachine
where TargetState: State + ReturnMessage<Message>
{
/// This will call the return_message function of ``` FooState ``` if it implemented the ReturnMessage
/// trait for message 'FooMessage' and it has been declared to do so with the add_message! macro.
///```ignore
/// use sfsm_base::PollMessage;
/// let some_message = PollMessage::<FooState, FooMessage>::poll_message(&mut sfsm);
///```
fn poll_message(&mut self) -> Result<Option<Message>, MessageError<()>>;
}
}
/// Trait to handle an incoming message
///
/// Implement this trait for a state that can receive a message according to the add_message
/// definition.
/// Note: for the state to actually be able to receive a message, the message has to be added with
/// the add_message!
pub trait ReceiveMessage<Message> {
/// Receive a message when a message for the corresponding state is pushed into the state
/// machine
///
/// ```rust
/// # use sfsm_base::message::ReceiveMessage;
/// # #[derive(Debug)]
/// # struct Message {};
/// # struct State {};
/// #
/// # impl ReceiveMessage<Message> for State {
/// fn receive_message(&mut self, message: Message) {
/// println!("Got a message {:?}", message);
/// }
/// # }
/// ```
fn receive_message(&mut self, message: Message);
}
/// Trait to handle an outgoing message
///
/// Implement this trait for a state that can return a message according to the add_message
/// definition.
/// Note: for the state to actually be able to return a message, the message has to be added with
/// the add_message! macro.
pub trait ReturnMessage<Message> {
/// Return a message from a state when polled
///
/// ```rust
/// # use sfsm_base::message::ReturnMessage;
/// # struct Message {};
/// # struct State {};
/// #
/// # impl ReturnMessage<Message> for State {
/// fn return_message(&mut self) -> Option<Message> {
/// let message = Message{};
/// println!("Returning a message when polled");
/// return Some(message);
/// }
/// # }
///
/// ```
fn return_message(&mut self) -> Option<Message>;
}