use clap::Parser;
use log::info;
use minio::s3::response::BucketExistsResponse;
use minio::s3::types::{BucketName, ObjectKey, S3Api};
use minio::s3::{MinioClient, MinioClientBuilder, builders::ObjectContent, creds::StaticProvider};
use std::path::PathBuf;
#[derive(Parser)]
struct Cli {
bucket: String,
object: String,
file: PathBuf,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let args = Cli::parse();
let static_provider = StaticProvider::new("minioadmin", "minioadmin", None);
let client: MinioClient = MinioClientBuilder::new("http://localhost:9000".parse()?)
.provider(Some(static_provider))
.build()?;
let resp: BucketExistsResponse = client
.bucket_exists(BucketName::new(&args.bucket)?)?
.build()
.send()
.await?;
if !resp.exists() {
client
.create_bucket(BucketName::new(&args.bucket)?)?
.build()
.send()
.await?;
}
let content = ObjectContent::from(args.file.as_path());
client
.put_object_content(
BucketName::new(&args.bucket)?,
ObjectKey::new(&args.object)?,
content,
)?
.build()
.send()
.await?;
info!(
"Uploaded file at {:?} to {}/{}",
args.file, args.bucket, args.object
);
Ok(())
}