playdate_device/interface/
mod.rs

1use 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 {}