serial_debugcon/
resolver.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Resource resolver for a serial debugcon chipset device.
5
6use crate::SerialDebugcon;
7use async_trait::async_trait;
8use chipset_device_resources::ResolveChipsetDeviceHandleParams;
9use chipset_device_resources::ResolvedChipsetDevice;
10use serial_core::resources::ResolveSerialBackendParams;
11use serial_debugcon_resources::SerialDebugconDeviceHandle;
12use thiserror::Error;
13use vm_resource::AsyncResolveResource;
14use vm_resource::ResolveError;
15use vm_resource::ResourceResolver;
16use vm_resource::declare_static_async_resolver;
17use vm_resource::kind::ChipsetDeviceHandleKind;
18
19/// The resource resolver for [`SerialDebugcon`].
20pub struct SerialDebugconResolver;
21
22declare_static_async_resolver! {
23    SerialDebugconResolver,
24    (ChipsetDeviceHandleKind, SerialDebugconDeviceHandle),
25}
26
27/// An error resolving a [`SerialDebugconDeviceHandle`].
28#[expect(missing_docs)]
29#[derive(Debug, Error)]
30pub enum ResolveDebugconError {
31    #[error("failed to resolve io backend")]
32    ResolveBackend(#[source] ResolveError),
33}
34
35#[async_trait]
36impl AsyncResolveResource<ChipsetDeviceHandleKind, SerialDebugconDeviceHandle>
37    for SerialDebugconResolver
38{
39    type Output = ResolvedChipsetDevice;
40    type Error = ResolveDebugconError;
41
42    async fn resolve(
43        &self,
44        resolver: &ResourceResolver,
45        resource: SerialDebugconDeviceHandle,
46        input: ResolveChipsetDeviceHandleParams<'_>,
47    ) -> Result<Self::Output, Self::Error> {
48        let io = resolver
49            .resolve(
50                resource.io,
51                ResolveSerialBackendParams {
52                    driver: Box::new(input.task_driver_source.simple()),
53                    _async_trait_workaround: &(),
54                },
55            )
56            .await
57            .map_err(ResolveDebugconError::ResolveBackend)?;
58
59        let device = SerialDebugcon::new(resource.port, io.0.into_io());
60        Ok(device.into())
61    }
62}