pub mod filesystem;
pub use filesystem::FileSystemTarget;
pub use asuran_core::manifest::listing::*;
use async_trait::async_trait;
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(not(tarpaulin_include))]
pub fn total_size(&self) -> u64 {
self.total_size
}
#[cfg(not(tarpaulin_include))]
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(not(tarpaulin_include))]
pub fn total_size(&self) -> u64 {
self.total_size
}
#[cfg(not(tarpaulin_include))]
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,
});
}
}
#[async_trait]
pub trait BackupTarget<T: Read>: Clone + Send + Sync {
async fn backup_paths(&self) -> Listing;
async fn backup_object(&self, node: Node) -> HashMap<String, BackupObject<T>>;
async fn backup_listing(&self) -> Listing;
}
#[async_trait]
pub trait RestoreTarget<T: Write>: Clone + Send + Sync {
async fn load_listing(root_path: &str, listing: Listing) -> Self;
async fn restore_listing(&self) -> Listing;
async fn restore_object(&self, path: Node) -> HashMap<String, RestoreObject<T>>;
}