playdate_device/interface/
mod.rs1use futures::FutureExt;
2
3use crate::error::Error;
4
5pub mod blocking;
6pub mod r#async;
7
8
9pub enum Interface {
10 Usb(crate::usb::Interface),
11 Serial(crate::serial::Interface),
12}
13
14impl From<crate::usb::Interface> for Interface {
15 fn from(interface: crate::usb::Interface) -> Self { Self::Usb(interface) }
16}
17
18impl From<crate::serial::Interface> for Interface {
19 fn from(interface: crate::serial::Interface) -> Self { Self::Serial(interface) }
20}
21
22
23impl std::fmt::Display for Interface {
24 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25 match self {
26 Interface::Usb(interface) => interface.fmt(f),
27 Interface::Serial(interface) => interface.fmt(f),
28 }
29 }
30}
31
32
33impl std::fmt::Debug for Interface {
34 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35 match self {
36 Self::Usb(_) => f.debug_tuple("Usb").finish(),
37 Self::Serial(i) => f.debug_tuple("Serial").field(i.info()).finish(),
38 }
39 }
40}
41
42
43impl r#async::Out for Interface
44 where crate::usb::Interface: r#async::Out,
45 crate::serial::Interface: r#async::Out
46{
47 #[inline(always)]
48 fn send(&self, data: &[u8]) -> impl futures::Future<Output = Result<usize, Error>> {
49 match self {
50 Self::Usb(i) => i.send(data).left_future(),
51 Self::Serial(i) => i.send(data).right_future(),
52 }
53 }
54
55 #[inline(always)]
56 async fn send_cmd(&self, cmd: crate::device::command::Command) -> Result<usize, Error> {
57 match self {
58 Interface::Usb(i) => r#async::Out::send_cmd(i, cmd).await,
59 Interface::Serial(i) => r#async::Out::send_cmd(i, cmd).await,
60 }
61 }
62}
63
64impl r#async::In for Interface
65 where crate::usb::Interface: r#async::In,
66 crate::serial::Interface: r#async::In
67{
68}
69
70
71impl blocking::Out for Interface {
72 #[inline(always)]
73 fn send_cmd(&self, cmd: crate::device::command::Command) -> Result<usize, Error> {
74 match self {
75 Interface::Usb(i) => blocking::Out::send_cmd(i, cmd),
76 Interface::Serial(i) => blocking::Out::send_cmd(i, cmd),
77 }
78 }
79}
80
81impl blocking::In for Interface {}