hcl_compat_uefi_nvram_storage/
storage_backend.rs1use thiserror::Error;
7
8#[derive(Error, Debug)]
10#[error("error accessing nvram storage backend")]
11pub struct StorageBackendError(#[from] anyhow::Error);
12
13impl StorageBackendError {
14 pub fn new(e: impl Into<anyhow::Error>) -> StorageBackendError {
16 Self(e.into())
17 }
18}
19
20#[async_trait::async_trait]
22pub trait StorageBackend: Send + Sync {
23 async fn persist(&mut self, data: Vec<u8>) -> Result<(), StorageBackendError>;
25
26 async fn restore(&mut self) -> Result<Option<Vec<u8>>, StorageBackendError>;
28}
29
30#[async_trait::async_trait]
32impl StorageBackend for Box<dyn StorageBackend> {
33 async fn persist(&mut self, data: Vec<u8>) -> Result<(), StorageBackendError> {
34 (**self).persist(data).await
35 }
36
37 async fn restore(&mut self) -> Result<Option<Vec<u8>>, StorageBackendError> {
38 (**self).restore().await
39 }
40}
41
42#[async_trait::async_trait]
44impl<T> StorageBackend for &mut T
45where
46 T: StorageBackend,
47{
48 async fn persist(&mut self, data: Vec<u8>) -> Result<(), StorageBackendError> {
49 (**self).persist(data).await
50 }
51
52 async fn restore(&mut self) -> Result<Option<Vec<u8>>, StorageBackendError> {
53 (**self).restore().await
54 }
55}