#![deny(clippy::unwrap_used)]
#![deny(clippy::expect_used)]
#![deny(clippy::panic)]
#![deny(clippy::manual_assert)]
#![deny(clippy::indexing_slicing)]
use avml::{put, BlobUploader, Error, DEFAULT_CONCURRENCY};
use clap::{Parser, Subcommand};
use std::path::PathBuf;
use tokio::runtime::Runtime;
use url::Url;
#[derive(Parser)]
#[command(version)]
struct Cmd {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Put {
filename: PathBuf,
url: Url,
},
UploadBlob {
filename: PathBuf,
url: Url,
#[arg(long, default_value_t=DEFAULT_CONCURRENCY)]
sas_block_concurrency: usize,
#[arg(long)]
sas_block_size: Option<usize>,
},
}
async fn run(cmd: Cmd) -> avml::Result<()> {
match cmd.command {
Commands::Put { filename, url } => put(&filename, &url).await?,
Commands::UploadBlob {
filename,
url,
sas_block_size,
sas_block_concurrency,
} => {
let uploader = BlobUploader::new(&url)?
.block_size(sas_block_size)
.concurrency(sas_block_concurrency);
uploader.upload_file(&filename).await?;
}
}
Ok(())
}
fn main() -> avml::Result<()> {
let cmd = Cmd::parse();
Runtime::new().map_err(Error::Tokio)?.block_on(run(cmd))?;
Ok(())
}