use crate::{error::TusError, info::{UploadId, UploadInfo}};
#[trait_variant::make(SendUpload: Send)]
pub trait Upload {
async fn write_chunk(
&mut self,
offset: u64,
reader: &mut (dyn tokio::io::AsyncRead + Unpin + Send),
) -> Result<u64, TusError>;
async fn get_info(&self) -> Result<UploadInfo, TusError>;
async fn finalize(&mut self) -> Result<(), TusError>;
async fn delete(self) -> Result<(), TusError>;
async fn declare_length(&mut self, length: u64) -> Result<(), TusError>;
async fn concatenate(&mut self, partials: &[UploadInfo]) -> Result<(), TusError>;
}
#[trait_variant::make(SendDataStore: Send)]
pub trait DataStore {
type UploadType: SendUpload;
async fn create_upload(&self, info: UploadInfo) -> Result<Self::UploadType, TusError>;
async fn get_upload(&self, id: &UploadId) -> Result<Self::UploadType, TusError>;
}