use crate::{
DiffRequest, DiffResponse, PatchRequest, PatchResponse, ScanRequest,
ScanResponse, SyncOptions,
};
use async_trait::async_trait;
use sos_core::Origin;
use sos_sync::{CreateSet, MergeOutcome, SyncPacket, SyncStatus, UpdateSet};
#[derive(Debug)]
pub struct RemoteResult<E> {
pub origin: Origin,
pub result: Result<Option<MergeOutcome>, E>,
}
#[derive(Debug)]
pub struct SyncResult<E> {
pub remotes: Vec<RemoteResult<E>>,
}
impl<E> Default for SyncResult<E> {
fn default() -> Self {
Self {
remotes: Vec::new(),
}
}
}
impl<E> SyncResult<E> {
pub fn first_error(self) -> Option<E> {
self.remotes.into_iter().find_map(|res| {
if res.result.is_err() {
res.result.err()
} else {
None
}
})
}
pub fn first_error_ref(&self) -> Option<&E> {
self.remotes.iter().find_map(|res| {
if let Err(e) = &res.result {
Some(e)
} else {
None
}
})
}
pub fn has_error(&self) -> bool {
self.remotes.iter().any(|r| r.result.is_err())
}
}
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
pub trait RemoteSync {
type Error: std::error::Error + std::fmt::Debug;
async fn sync(&self) -> RemoteResult<Self::Error>;
async fn sync_with_options(
&self,
options: &SyncOptions,
) -> RemoteResult<Self::Error>;
async fn force_update(
&self,
account_data: UpdateSet,
) -> RemoteResult<Self::Error>;
#[cfg(feature = "files")]
async fn sync_file_transfers(&self) -> RemoteResult<Self::Error>;
}
#[async_trait]
pub trait AccountSync {
type Error: std::error::Error + std::fmt::Debug;
async fn sync(&self) -> SyncResult<Self::Error>;
async fn sync_with_options(
&self,
options: &SyncOptions,
) -> SyncResult<Self::Error>;
#[cfg(feature = "files")]
async fn sync_file_transfers(
&self,
options: &SyncOptions,
) -> SyncResult<Self::Error>;
async fn force_update(
&self,
account_data: UpdateSet,
options: &SyncOptions,
) -> SyncResult<Self::Error>;
}
#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
pub trait SyncClient {
type Error: std::error::Error + std::fmt::Debug;
fn origin(&self) -> &Origin;
async fn account_exists(&self) -> Result<bool, Self::Error>;
async fn create_account(
&self,
account: CreateSet,
) -> Result<(), Self::Error>;
async fn update_account(
&self,
account: UpdateSet,
) -> Result<(), Self::Error>;
async fn fetch_account(&self) -> Result<CreateSet, Self::Error>;
async fn delete_account(&self) -> Result<(), Self::Error>;
async fn sync_status(&self) -> Result<SyncStatus, Self::Error>;
async fn sync(
&self,
packet: SyncPacket,
) -> Result<SyncPacket, Self::Error>;
async fn scan(
&self,
request: ScanRequest,
) -> Result<ScanResponse, Self::Error>;
async fn diff(
&self,
request: DiffRequest,
) -> Result<DiffResponse, Self::Error>;
async fn patch(
&self,
request: PatchRequest,
) -> Result<PatchResponse, Self::Error>;
}