use crate::bus::s3_sink::BusS3SinkConfig;
use anyhow::{Context, Result};
use minio::s3::creds::StaticProvider;
use minio::s3::http::BaseUrl;
use minio::s3::{Client as MinioClient, ClientBuilder as MinioClientBuilder};
use std::str::FromStr;
use super::super::helpers::normalize_endpoint;
pub(in super::super) struct MinioOracleRemote {
pub(super) client: MinioClient,
pub(super) endpoint: String,
pub(super) bucket: String,
pub(super) prefix: String,
pub(super) region: String,
}
impl MinioOracleRemote {
pub fn from_bus_config(config: BusS3SinkConfig) -> Result<Self> {
let endpoint = normalize_endpoint(&config.endpoint, config.secure);
let creds = StaticProvider::new(&config.access_key, &config.secret_key, None);
let base_url = BaseUrl::from_str(&endpoint)
.with_context(|| format!("Invalid MinIO endpoint: {endpoint}"))?;
let client = MinioClientBuilder::new(base_url)
.provider(Some(Box::new(creds)))
.build()
.context("Failed to build MinIO client")?;
let region = std::env::var("CODETETHER_BUS_S3_REGION")
.or_else(|_| std::env::var("MINIO_REGION"))
.or_else(|_| std::env::var("AWS_REGION"))
.unwrap_or_else(|_| "us-east-1".to_string());
Ok(Self {
client,
endpoint,
bucket: config.bucket,
prefix: config.prefix,
region,
})
}
}