pub trait CloudHome: Send + Sync {
// Required methods
fn put_object<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
data: Vec<u8>,
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>
where 'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait;
fn open_multipart<'a, 'life0, 'async_trait>(
&'a self,
key: &'life0 str,
total_len: u64,
) -> Pin<Box<dyn Future<Output = Result<Box<dyn PartSink + 'a>, CloudHomeError>> + Send + 'async_trait>>
where 'a: 'async_trait,
'life0: 'async_trait,
Self: 'async_trait;
fn multipart_threshold(&self) -> u64;
fn read<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CloudHomeError>> + Send + 'async_trait>>
where 'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait;
fn read_range<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
start: u64,
end: u64,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CloudHomeError>> + Send + 'async_trait>>
where 'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait;
fn list<'life0, 'life1, 'async_trait>(
&'life0 self,
prefix: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<String>, CloudHomeError>> + Send + 'async_trait>>
where 'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait;
fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>
where 'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait;
fn exists<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, CloudHomeError>> + Send + 'async_trait>>
where 'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait;
fn set_access<'life0, 'async_trait>(
&'life0 self,
desired: CloudAccessState,
) -> Pin<Box<dyn Future<Output = Result<CloudAccessOutcome, CloudHomeError>> + Send + 'async_trait>>
where 'life0: 'async_trait,
Self: 'async_trait;
// Provided methods
fn exact_slot_storage(self: Arc<Self>) -> Option<Arc<dyn ExactSlotStorage>> { ... }
fn probe<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>
where 'life0: 'async_trait,
Self: 'async_trait { ... }
fn write<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
key: &'life1 str,
body: BlobBody,
progress: &'life2 (dyn Fn(u64) + Sync + Send + 'life3),
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>
where 'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Self: 'async_trait { ... }
}Required Methods§
Sourcefn put_object<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
data: Vec<u8>,
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn put_object<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
data: Vec<u8>,
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
One bounded single-request upload, creating or overwriting key. Used only
for blobs at or below multipart_threshold;
large blobs stream through open_multipart.
Sourcefn open_multipart<'a, 'life0, 'async_trait>(
&'a self,
key: &'life0 str,
total_len: u64,
) -> Pin<Box<dyn Future<Output = Result<Box<dyn PartSink + 'a>, CloudHomeError>> + Send + 'async_trait>>where
'a: 'async_trait,
'life0: 'async_trait,
Self: 'async_trait,
fn open_multipart<'a, 'life0, 'async_trait>(
&'a self,
key: &'life0 str,
total_len: u64,
) -> Pin<Box<dyn Future<Output = Result<Box<dyn PartSink + 'a>, CloudHomeError>> + Send + 'async_trait>>where
'a: 'async_trait,
'life0: 'async_trait,
Self: 'async_trait,
Open a streaming multipart/resumable upload for total_len bytes, returning
the PartSink the driver pumps ordered parts into.
Sourcefn multipart_threshold(&self) -> u64
fn multipart_threshold(&self) -> u64
Blobs at or below this size go via put_object;
larger ones stream via open_multipart.
Sourcefn read<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn read<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
Read the full contents of a key.
Sourcefn read_range<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
start: u64,
end: u64,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn read_range<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
start: u64,
end: u64,
) -> Pin<Box<dyn Future<Output = Result<Vec<u8>, CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
Read a byte range from a key. start is inclusive, end is exclusive.
Sourcefn list<'life0, 'life1, 'async_trait>(
&'life0 self,
prefix: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<String>, CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn list<'life0, 'life1, 'async_trait>(
&'life0 self,
prefix: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<Vec<String>, CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
List all keys under a prefix.
Sourcefn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn delete<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
Delete a key. Not an error if the key does not exist.
Sourcefn exists<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn exists<'life0, 'life1, 'async_trait>(
&'life0 self,
key: &'life1 str,
) -> Pin<Box<dyn Future<Output = Result<bool, CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
Check whether a key exists.
Sourcefn set_access<'life0, 'async_trait>(
&'life0 self,
desired: CloudAccessState,
) -> Pin<Box<dyn Future<Output = Result<CloudAccessOutcome, CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn set_access<'life0, 'async_trait>(
&'life0 self,
desired: CloudAccessState,
) -> Pin<Box<dyn Future<Output = Result<CloudAccessOutcome, CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Set the provider’s access for one stable member principal to the absolute
desired state. Implementations read the authoritative permission state,
create/update/delete as required, then read it back and verify the desired
state. Repeating a request after an unknown outcome is therefore
idempotent. Present returns connection information; Absent returns
whether this provider supports withdrawing one member’s credential.
Provided Methods§
fn exact_slot_storage(self: Arc<Self>) -> Option<Arc<dyn ExactSlotStorage>>
Sourcefn probe<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn probe<'life0, 'async_trait>(
&'life0 self,
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Verify the backend is reachable with the configured credentials. Setup flows call this before persisting credentials, so a typo or missing bucket fails fast at setup time instead of via a delayed reconnect banner. Default implementation issues a no-op list against a sentinel prefix — backends override with cheaper provider-specific auth checks (e.g. S3 HeadBucket) where available.
Sourcefn write<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
key: &'life1 str,
body: BlobBody,
progress: &'life2 (dyn Fn(u64) + Sync + Send + 'life3),
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Self: 'async_trait,
fn write<'life0, 'life1, 'life2, 'life3, 'async_trait>(
&'life0 self,
key: &'life1 str,
body: BlobBody,
progress: &'life2 (dyn Fn(u64) + Sync + Send + 'life3),
) -> Pin<Box<dyn Future<Output = Result<(), CloudHomeError>> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
'life2: 'async_trait,
'life3: 'async_trait,
Self: 'async_trait,
Write a sized BlobBody to key. Not overridden — the central
[write_blob] driver picks single-request vs multipart and pumps the
parts, reporting cumulative bytes through progress for the per-file bar.