use bytes::Bytes;
use futures_core::Stream;
use std::future::Future;
use std::time::Duration;
use thiserror::Error;
use url::Url;
pub mod file;
pub mod http;
#[derive(Debug, Error)]
pub enum TransferError {
#[error(
"Transient error (retryable after at least {minimum_retry_delay:?}) after consuming {consumed_byte_count} bytes: {reason}."
)]
Transient {
consumed_byte_count: u64,
minimum_retry_delay: Duration,
reason: String,
},
#[error("Permanent error: {reason}")]
Permanent { reason: String },
}
#[derive(Debug)]
pub struct ReadOffset {
pub offset: u64,
pub total_size: Option<u64>,
pub supports_random_access: bool,
}
pub trait SourceProtocol {
type Reader: SourceReader;
fn get_reader(
&mut self,
url: Url,
start_byte_offset: u64,
) -> impl Future<Output = Result<(Self::Reader, ReadOffset), TransferError>> + Send;
}
pub trait SourceReader {
fn stream_bytes(self) -> impl Stream<Item = Result<Bytes, TransferError>> + Send;
}
pub trait DestinationProtocol {
type Writer: DestinationWriter;
fn get_writer(&self, url: Url) -> impl Future<Output = Result<Self::Writer, TransferError>>;
}
pub trait DestinationWriter {
fn write(&mut self, bytes: &[u8]) -> impl Future<Output = Result<(), TransferError>>;
fn finalize(self) -> impl Future<Output = Result<(), TransferError>>;
fn truncate_and_reset(&mut self) -> impl Future<Output = Result<(), TransferError>>;
}