disklayer_ram/
resolver.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Resource resolver for RAM-backed disk layers.
5
6use super::Error;
7use super::RamDiskLayer;
8use crate::LazyRamDiskLayer;
9use disk_backend_resources::layer::RamDiskLayerHandle;
10use disk_layered::resolve::ResolveDiskLayerParameters;
11use disk_layered::resolve::ResolvedDiskLayer;
12use vm_resource::ResolveResource;
13use vm_resource::declare_static_resolver;
14use vm_resource::kind::DiskLayerHandleKind;
15
16/// Resolver for a [`RamDiskLayerHandle`].
17pub struct RamDiskLayerResolver;
18
19declare_static_resolver!(
20    RamDiskLayerResolver,
21    (DiskLayerHandleKind, RamDiskLayerHandle)
22);
23
24/// Error type for [`RamDiskLayerResolver`].
25#[derive(Debug, Error)]
26pub enum ResolveRamDiskError {
27    /// Failed to create the RAM disk layer.
28    #[error("failed to create ram disk layer")]
29    Ram(#[source] Error),
30}
31
32impl ResolveResource<DiskLayerHandleKind, RamDiskLayerHandle> for RamDiskLayerResolver {
33    type Output = ResolvedDiskLayer;
34    type Error = ResolveRamDiskError;
35
36    fn resolve(
37        &self,
38        rsrc: RamDiskLayerHandle,
39        _input: ResolveDiskLayerParameters<'_>,
40    ) -> Result<Self::Output, Self::Error> {
41        Ok(match rsrc.len {
42            Some(len) => {
43                ResolvedDiskLayer::new(RamDiskLayer::new(len).map_err(ResolveRamDiskError::Ram)?)
44            }
45            None => ResolvedDiskLayer::new(LazyRamDiskLayer::new()),
46        })
47    }
48}