1use futures::{Sink, Stream};
2
3#[cfg(feature = "nb")]
4pub mod transmit;
5#[cfg(feature = "mock")]
6pub use transmit::MockTransmit;
7#[cfg(feature = "nb")]
8pub use transmit::Transmitter;
9
10#[cfg(feature = "nb")]
11pub mod receive;
12#[cfg(feature = "nb")]
13pub use receive::{DualReceiver, Receiver};
14
15pub use embedded_hal::can::Frame;
16
17pub trait Can: CanReceive + CanTransmit<Self::Frame> {}
18
19impl<T> Can for T where T: ?Sized + CanReceive + CanTransmit<Self::Frame> {}
20
21pub trait CanReceive:
22 Stream<Item = Result<Self::Frame, Self::Error>> + can_receive::Sealed
23{
24 type Frame: Frame;
25
26 type Error;
27}
28
29impl<T, F, E> CanReceive for T
30where
31 T: ?Sized + Stream<Item = Result<F, E>>,
32 F: ?Sized + Frame,
33{
34 type Frame = F;
35
36 type Error = E;
37}
38
39pub trait CanTransmit<F>: Sink<F> + can_transmit::Sealed {}
40
41impl<T, F> CanTransmit<F> for T where T: ?Sized + Sink<F> {}
42
43mod can_receive {
44 use super::Stream;
45
46 pub trait Sealed {}
47
48 impl<T, F, E> Sealed for T where T: ?Sized + Stream<Item = Result<F, E>> {}
49}
50
51mod can_transmit {
52
53 pub trait Sealed {}
54
55 impl<T> Sealed for T where T: ?Sized {}
56}
57
58#[cfg(feature = "mock")]
59mod mock {
60 use embedded_hal::can::{Frame, Id};
61
62 #[derive(Clone, Debug, PartialEq, Eq)]
63 pub struct MockFrame {
64 pub id: Id,
65 pub data: Vec<u8>,
66 }
67
68 impl Frame for MockFrame {
69 fn new(id: impl Into<Id>, data: &[u8]) -> Option<Self> {
70 Some(Self {
71 id: id.into(),
72 data: data.to_owned(),
73 })
74 }
75
76 fn new_remote(_id: impl Into<Id>, _dlc: usize) -> Option<Self> {
77 todo!()
78 }
79
80 fn is_extended(&self) -> bool {
81 todo!()
82 }
83
84 fn is_remote_frame(&self) -> bool {
85 todo!()
86 }
87
88 fn id(&self) -> Id {
89 todo!()
90 }
91
92 fn dlc(&self) -> usize {
93 todo!()
94 }
95
96 fn data(&self) -> &[u8] {
97 todo!()
98 }
99 }
100}
101
102#[cfg(feature = "mock")]
103pub use mock::MockFrame;