use std::fmt; use remora_outbound::CanonicalUrl; use remora_target::TargetStoreConfig; use crate::ObjectSourceError; #[derive(Clone, Eq, PartialEq)] pub struct ObjectSourceConfig { endpoint: CanonicalUrl, bucket: String, region: String, access_key_id: String, secret_access_key: String, } impl ObjectSourceConfig { pub fn new( endpoint: &str, bucket: impl Into, region: impl Into, access_key_id: impl Into, secret_access_key: impl Into, ) -> Result { let endpoint = CanonicalUrl::parse(endpoint).map_err(|_| ObjectSourceError::InvalidRequest)?; let bucket = bucket.into(); let region = region.into(); let access_key_id = access_key_id.into(); let secret_access_key = secret_access_key.into(); if bucket.is_empty() || access_key_id.is_empty() || secret_access_key.is_empty() { return Err(ObjectSourceError::InvalidRequest); } Ok(Self { endpoint, bucket, region, access_key_id, secret_access_key, }) } pub fn from_target(config: &TargetStoreConfig) -> Result { Self::new( &config.endpoint, config.bucket.clone(), config.region.clone(), config.access_key_id.clone(), config.secret_access_key.clone(), ) } #[must_use] pub fn endpoint(&self) -> &CanonicalUrl { &self.endpoint } #[must_use] pub fn bucket(&self) -> &str { &self.bucket } pub(crate) fn region(&self) -> &str { &self.region } pub(crate) fn access_key_id(&self) -> &str { &self.access_key_id } pub(crate) fn secret_access_key(&self) -> &str { &self.secret_access_key } } impl fmt::Debug for ObjectSourceConfig { fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter .debug_struct("ObjectSourceConfig") .field("bucket", &self.bucket) .field("region", &self.region) .finish_non_exhaustive() } }