use crate::state::{event, is};
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub enum Sender {
#[default]
Ready,
Send,
DataSent,
DataRecvd,
ResetQueued,
ResetSent,
ResetRecvd,
}
impl Sender {
is!(is_ready, Ready);
is!(is_sending, Send);
is!(is_data_sent, DataSent);
is!(is_data_received, DataRecvd);
is!(is_reset_queued, ResetQueued);
is!(is_reset_sent, ResetSent);
is!(is_reset_received, ResetRecvd);
is!(is_terminal, DataRecvd | ResetRecvd);
event! {
on_send_stream(Ready => Send);
on_send_fin(Ready | Send => DataSent);
on_recv_all_acks(DataSent | ResetQueued => DataRecvd);
on_queue_reset(Ready | Send | DataSent => ResetQueued);
on_send_reset(Ready | Send | DataSent | ResetQueued => ResetSent);
on_recv_reset_ack(ResetSent => ResetRecvd);
}
}
#[cfg(test)]
mod tests {
use super::*;
use insta::{assert_debug_snapshot, assert_snapshot};
#[test]
#[cfg_attr(miri, ignore)]
fn snapshots() {
assert_debug_snapshot!(Sender::test_transitions());
}
#[test]
#[cfg_attr(miri, ignore)]
fn dot_test() {
assert_snapshot!(Sender::dot());
}
}