pub mod filesystem;
pub use filesystem::FileSystemTarget;
use std::collections::HashMap;
use std::io::{Read, Write};
pub struct ByteRange<T> {
pub start: u64,
pub end: u64,
pub object: T,
}
pub struct BackupObject<T: Read> {
ranges: Vec<ByteRange<T>>,
total_size: u64,
}
impl<T: Read> BackupObject<T> {
pub fn new(total_size: u64) -> BackupObject<T> {
let ranges = Vec::new();
BackupObject { ranges, total_size }
}
pub fn add_range(&mut self, range: ByteRange<T>) {
self.ranges.push(range);
}
#[cfg_attr(tarpaulin, skip)]
pub fn total_size(&self) -> u64 {
self.total_size
}
#[cfg_attr(tarpaulin, skip)]
pub fn set_total_size(&mut self, total_size: u64) {
self.total_size = total_size;
}
pub fn ranges(self) -> Vec<ByteRange<T>> {
self.ranges
}
pub fn direct_add_range(&mut self, start: u64, end: u64, read: T) {
self.add_range(ByteRange {
start,
end,
object: read,
});
}
}
pub struct RestoreObject<T: Write> {
ranges: Vec<ByteRange<T>>,
total_size: u64,
}
impl<T: Write> RestoreObject<T> {
pub fn new(total_size: u64) -> RestoreObject<T> {
let ranges = Vec::new();
RestoreObject { ranges, total_size }
}
pub fn add_range(&mut self, range: ByteRange<T>) {
self.ranges.push(range);
}
#[cfg_attr(tarpaulin, skip)]
pub fn total_size(&self) -> u64 {
self.total_size
}
#[cfg_attr(tarpaulin, skip)]
pub fn set_total_size(&mut self, total_size: u64) {
self.total_size = total_size;
}
pub fn ranges(self) -> Vec<ByteRange<T>> {
self.ranges
}
pub fn direct_add_range(&mut self, start: u64, end: u64, write: T) {
self.add_range(ByteRange {
start,
end,
object: write,
});
}
}
pub trait BackupTarget<T: Read>: Clone + Send + Sync {
fn backup_paths(&self) -> Vec<String>;
fn backup_object(&self, path: &str) -> HashMap<String, BackupObject<T>>;
fn backup_listing(&self) -> Vec<u8>;
}
pub trait RestoreTarget<T: Write>: Clone + Send + Sync {
fn load_listing(listing: &[u8]) -> Option<Self>;
fn restore_object(&self, path: &str) -> HashMap<String, RestoreObject<T>>;
fn restore_listing(&self) -> Vec<String>;
}