1use crate::utilities::*;
2
3use num_traits::FromPrimitive;
4use num_traits::ToPrimitive;
5use std::fmt::Display;
6use std::fmt::Formatter;
7use std::fmt::Result as FormatterResult;
8
9#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone, Debug)]
13pub struct MessageIndex(u8);
14
15impl IndexLike for MessageIndex {
16 fn from_usize(value: usize) -> MessageIndex {
17 MessageIndex(u8::from_usize(value).unwrap())
18 }
19
20 fn to_usize(&self) -> usize {
21 let MessageIndex(value) = self;
22 u8::to_usize(value).unwrap()
23 }
24
25 fn invalid() -> MessageIndex {
27 MessageIndex(u8::max_value())
28 }
29 }
31
32impl Display for MessageIndex {
35 fn fmt(&self, formatter: &mut Formatter<'_>) -> FormatterResult {
36 write!(formatter, "{}", self.to_usize())
37 }
38}
39
40#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone, Debug)]
42pub enum MessageOrder {
43 Immediate,
45
46 Unordered,
48
49 Ordered(MessageIndex),
52}
53
54#[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Copy, Clone, Debug)]
56pub struct Message<Payload: DataLike> {
57 pub order: MessageOrder,
59
60 pub source_index: usize,
62
63 pub target_index: usize,
65
66 pub payload: Payload,
68
69 pub replaced: Option<Payload>,
71}
72
73impl<Payload: DataLike> Default for Message<Payload> {
74 fn default() -> Self {
75 Message {
76 order: MessageOrder::Unordered,
77 source_index: usize::max_value(),
78 target_index: usize::max_value(),
79 payload: Default::default(),
80 replaced: None,
81 }
82 }
83}