adapter.rs (2669B)
1 use super::*; 2 use radroots_storage::outbox::BoxFuture; 3 use tera_core::runtime::backup::{ 4 ApplicationBackupManifest, BackupHost, BackupMediaLease, BackupMediaRequirement, 5 }; 6 7 pub(crate) struct BackupHostAdapter(pub(crate) Box<dyn TeraBackupHost>); 8 9 impl BackupHost for BackupHostAdapter { 10 fn load_candidate( 11 &self, 12 request: BackupRequest, 13 ) -> BoxFuture<'_, Result<Option<Vec<u8>>, BackupError>> { 14 Box::pin(async move { 15 self.0 16 .load_candidate((&request).into()) 17 .await 18 .map_err(host_error) 19 }) 20 } 21 fn retain_media( 22 &self, 23 request: BackupRequest, 24 media: Vec<BackupMediaRequirement>, 25 ) -> BoxFuture<'_, Result<Vec<BackupMediaLease>, BackupError>> { 26 Box::pin(async move { 27 let media = media 28 .into_iter() 29 .map(|media| FfiBackupMedia { 30 lease_identifier: request.lease_identifier(&media.sha256), 31 sha256: media.sha256, 32 byte_length: media.byte_length, 33 }) 34 .collect(); 35 Ok(self 36 .0 37 .retain_media((&request).into(), media) 38 .await 39 .map_err(host_error)? 40 .into_iter() 41 .map(Into::into) 42 .collect()) 43 }) 44 } 45 fn persist_candidate( 46 &self, 47 manifest: ApplicationBackupManifest, 48 ) -> BoxFuture<'_, Result<(), BackupError>> { 49 Box::pin(async move { 50 self.0 51 .persist_candidate(manifest.try_into()?) 52 .await 53 .map_err(host_error) 54 }) 55 } 56 fn publish_complete( 57 &self, 58 manifest: ApplicationBackupManifest, 59 ) -> BoxFuture<'_, Result<(), BackupError>> { 60 Box::pin(async move { 61 self.0 62 .publish_complete(manifest.try_into()?) 63 .await 64 .map_err(host_error) 65 }) 66 } 67 } 68 69 impl TryFrom<ApplicationBackupManifest> for FfiBackupManifest { 70 type Error = BackupError; 71 fn try_from(value: ApplicationBackupManifest) -> Result<Self, Self::Error> { 72 Ok(Self { 73 request: value.request().into(), 74 media: value 75 .media() 76 .iter() 77 .map(|media| FfiBackupMedia { 78 sha256: media.sha256.clone(), 79 byte_length: media.byte_length, 80 lease_identifier: media.identifier.clone(), 81 }) 82 .collect(), 83 manifest: value.encode()?, 84 }) 85 } 86 }