1use crate::VmgsClient;
7use crate::non_volatile_store::EncryptionNotSupported;
8use crate::non_volatile_store::VmgsNonVolatileStore;
9use vm_resource::AsyncResolveResource;
10use vm_resource::CanResolveTo;
11use vm_resource::IntoResource;
12use vm_resource::PlatformResource;
13use vm_resource::ResolveResource;
14use vm_resource::ResourceKind;
15use vm_resource::ResourceResolver;
16use vm_resource::declare_static_async_resolver;
17use vm_resource::kind::NonVolatileStoreKind;
18use vmcore::non_volatile_store::resources::ResolvedNonVolatileStore;
19use vmgs_resources::VmgsFileHandle;
20
21pub struct VmgsFileResolver;
23
24declare_static_async_resolver! {
25 VmgsFileResolver,
26 (NonVolatileStoreKind, VmgsFileHandle),
27}
28
29#[derive(Debug, thiserror::Error)]
31pub enum VmgsFileResolverError {
32 #[error("error creating VMGS non-volatile store")]
34 Store(#[source] EncryptionNotSupported),
35 #[error("error resolving VMGS client")]
37 Client(#[source] vm_resource::ResolveError),
38}
39
40#[async_trait::async_trait]
41impl AsyncResolveResource<NonVolatileStoreKind, VmgsFileHandle> for VmgsFileResolver {
42 type Output = ResolvedNonVolatileStore;
43 type Error = VmgsFileResolverError;
44
45 async fn resolve(
46 &self,
47 resolver: &ResourceResolver,
48 resource: VmgsFileHandle,
49 _: &(),
50 ) -> Result<Self::Output, Self::Error> {
51 Ok(VmgsNonVolatileStore::new(
52 resolver
53 .resolve::<VmgsClientKind, _>(PlatformResource.into_resource(), ())
54 .await
55 .map_err(VmgsFileResolverError::Client)?,
56 vmgs_format::FileId(resource.file_id),
57 resource.encrypted,
58 )
59 .map_err(VmgsFileResolverError::Store)?
60 .into())
61 }
62}
63
64pub enum VmgsClientKind {}
68
69impl ResourceKind for VmgsClientKind {
70 const NAME: &'static str = "vmgs_client";
71}
72
73impl CanResolveTo<VmgsClient> for VmgsClientKind {
74 type Input<'a> = ();
75}
76
77impl ResolveResource<VmgsClientKind, PlatformResource> for VmgsClient {
78 type Output = VmgsClient;
79 type Error = std::convert::Infallible;
80
81 fn resolve(
82 &self,
83 PlatformResource: PlatformResource,
84 (): (),
85 ) -> Result<Self::Output, Self::Error> {
86 Ok(self.clone())
87 }
88}