mod chunk;
mod error;
mod sync;
#[cfg(feature = "network")]
pub use chunk::network::{RemoteChunkProvider, RemoteManifest};
pub use chunk::{
manifest::{FileChunkInfo, Manifest},
provider::CachingChunkProvider,
sync::Syncer,
Chunk, ChunkProvider,
};
pub use error::Error as BinsyncError;
use std::path::Path;
pub fn generate_manifest(from: &str) -> Result<Manifest, BinsyncError> {
let from_path = Path::new(&from);
if !from_path.exists() {
return Err(BinsyncError::FileNotFound(from_path.to_path_buf()));
}
let manifest = Manifest::from_path(from_path);
Ok(manifest)
}
pub fn sync_from_manifest<T: ChunkProvider>(
manifest: Manifest,
provider: T,
to: &str,
) -> Result<(), BinsyncError> {
let to_path = Path::new(&to);
let mut syncer = Syncer::new(to_path, provider, manifest);
syncer.sync()?;
Ok(())
}
pub fn sync(from: &str, to: &str) -> Result<(), BinsyncError> {
let manifest = generate_manifest(&from)?;
let from_path = Path::new(&from);
let provider = CachingChunkProvider::new(from_path);
sync_from_manifest(manifest, provider, to)
}
pub fn sync_with_progress(
from: &str,
to: &str,
on_progress: impl FnMut(u32),
) -> Result<(), BinsyncError> {
let manifest = generate_manifest(&from)?;
let from_path = Path::new(&from);
let provider = CachingChunkProvider::new(from_path);
let to_path = Path::new(&to);
let mut syncer = Syncer::new(to_path, provider, manifest);
syncer.on_progress(on_progress);
syncer.sync()?;
Ok(())
}