use std::fmt::Display;
use std::io;
use tokio::sync::oneshot::Sender;
use crate::Payload;
use crate::frame::{Error, Rst, RstAck};
use crate::utils::{HexSlice, WrappingU3};
#[derive(Debug)]
#[cfg_attr(target_pointer_width = "64", expect(variant_size_differences))]
pub enum Message {
Payload {
payload: Box<Payload>,
response_tx: Sender<io::Result<()>>,
},
Ack(WrappingU3),
Nak(WrappingU3),
Rst(Rst),
RstAck(RstAck),
Error(Error),
AckSentFrame(WrappingU3),
NakSentFrame(WrappingU3),
Terminate,
}
impl Display for Message {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Payload { payload, .. } => write!(f, "Payload({:#04X})", HexSlice::new(payload)),
Self::Ack(ack_num) => write!(f, "Ack({ack_num})"),
Self::Nak(ack_num) => write!(f, "Nak({ack_num})"),
Self::Rst(rst) => write!(f, "Rst({rst})"),
Self::RstAck(rst_ack) => write!(f, "RstAck({rst_ack})"),
Self::Error(error) => write!(f, "Error({error})"),
Self::AckSentFrame(ack_num) => write!(f, "AckSentFrame({ack_num})"),
Self::NakSentFrame(ack_num) => write!(f, "NakSentFrame({ack_num})"),
Self::Terminate => write!(f, "Terminate"),
}
}
}