1use core::time::Duration;
4
5use arbitrary_int::{i24, u24};
6
7use crate::messages::CanMessage;
8
9pub trait ReadSize {
11 const READ_SIZE: usize;
13}
14
15macro_rules! impl_read_size_builtin {
16 ($($rust_type:ty),+ $(,)?) => {
17 $(
18 impl ReadSize for $rust_type {
19 const READ_SIZE: usize = core::mem::size_of::<$rust_type>();
20 }
21 )+
22 };
23}
24impl_read_size_builtin!(bool, u8, u16, u32, u64, i8, i16, i32, i64, f32, f64);
25
26macro_rules! impl_read_size_arbitrary {
27 ($($rust_type:ty),+ $(,)?) => {
28 $(
29 impl ReadSize for $rust_type {
30 const READ_SIZE: usize = <$rust_type>::BITS.div_ceil(8);
31 }
32 )+
33 };
34}
35impl_read_size_arbitrary!(u24, i24);
36
37pub trait LoadStore<T> {
41 fn load(&self) -> T;
43 fn store(&self, value: T);
45}
46
47pub trait CanSender {
49 fn send(&mut self, msg: CanMessage) -> Result<(), CanMessage>;
51}
52
53pub trait CanReceiver {
55 type Error;
57 fn try_recv(&mut self) -> Option<CanMessage>;
60 fn recv(&mut self, timeout: Duration) -> Result<CanMessage, Self::Error>;
62}
63
64pub trait AsyncCanSender: Send {
66 type Error: CanSendError;
68 fn send(
70 &mut self,
71 msg: CanMessage,
72 ) -> impl core::future::Future<Output = Result<(), Self::Error>>;
73}
74
75pub trait CanSendError: core::fmt::Debug {
80 fn into_can_message(self) -> CanMessage;
82
83 #[cfg(feature = "std")]
85 #[cfg_attr(docsrs, doc(cfg(feature = "std")))]
86 fn message(&self) -> String;
87}
88
89pub trait AsyncCanReceiver: Send {
91 type Error: core::fmt::Debug + Send;
93
94 fn try_recv(&mut self) -> Option<CanMessage>;
96
97 fn recv(
99 &mut self,
100 ) -> impl core::future::Future<Output = Result<CanMessage, Self::Error>> + Send;
101
102 fn flush(&mut self) {
104 while self.try_recv().is_some() {}
105 }
106}