1use super::SerialIo;
7use mesh::MeshPayload;
8use pal_async::driver::Driver;
9use vm_resource::CanResolveTo;
10use vm_resource::Resource;
11use vm_resource::ResourceId;
12use vm_resource::kind::SerialBackendHandle;
13
14impl CanResolveTo<ResolvedSerialBackend> for SerialBackendHandle {
15 type Input<'a> = ResolveSerialBackendParams<'a>;
16}
17
18pub struct ResolveSerialBackendParams<'a> {
20 pub driver: Box<dyn Driver>,
22 #[doc(hidden)]
23 pub _async_trait_workaround: &'a (),
26}
27
28pub struct ResolvedSerialBackend(pub Box<dyn SerialBackend>);
30
31impl<T: 'static + SerialBackend> From<T> for ResolvedSerialBackend {
32 fn from(value: T) -> Self {
33 Self(Box::new(value))
34 }
35}
36
37pub trait SerialBackend: Send {
41 fn into_resource(self: Box<Self>) -> Resource<SerialBackendHandle>;
43 fn as_io(&self) -> &dyn SerialIo;
45 fn as_io_mut(&mut self) -> &mut dyn SerialIo;
47 fn into_io(self: Box<Self>) -> Box<dyn SerialIo>;
49}
50
51impl<T: 'static + SerialIo + Into<Resource<SerialBackendHandle>>> SerialBackend for T {
52 fn into_resource(self: Box<Self>) -> Resource<SerialBackendHandle> {
53 (*self).into()
54 }
55
56 fn as_io(&self) -> &dyn SerialIo {
57 self
58 }
59
60 fn as_io_mut(&mut self) -> &mut dyn SerialIo {
61 self
62 }
63
64 fn into_io(self: Box<Self>) -> Box<dyn SerialIo> {
65 self
66 }
67}
68
69#[derive(MeshPayload)]
71pub struct DisconnectedSerialBackendHandle;
72
73impl ResourceId<SerialBackendHandle> for DisconnectedSerialBackendHandle {
74 const ID: &'static str = "disconnected";
75}