use crate::protocol::file::{FileProtocol, WriteMode};
use crate::protocol::{DestinationProtocol, DestinationWriter, TransferError};
use crate::transfer::TransferConfig;
use url::Url;
pub enum Destination {
File(FileProtocol),
}
pub fn resolve_destination(
url: &Url,
config: &TransferConfig,
) -> Result<Destination, TransferError> {
let write_mode = if config.overwrite {
WriteMode::Overwrite
} else {
WriteMode::CreateNew
};
match url.scheme() {
"file" => Ok(Destination::File(FileProtocol::new(write_mode))),
scheme => Err(TransferError::Permanent {
reason: format!("unsupported destination protocol: {scheme}"),
}),
}
}
impl Destination {
pub async fn get_writer(&self, url: Url) -> Result<impl DestinationWriter, TransferError> {
match self {
Destination::File(proto) => {
let writer = proto.get_writer(url).await?;
Ok(writer)
}
}
}
}