use std::sync::Arc;
use crate::{
config::S3Config, cors::CorsIndex, state::service::S3ServiceState, storage::InMemoryStorage,
};
#[derive(Debug, Clone)]
pub struct RustackS3 {
pub(crate) state: Arc<S3ServiceState>,
pub(crate) storage: Arc<InMemoryStorage>,
pub(crate) cors_index: Arc<CorsIndex>,
pub(crate) config: Arc<S3Config>,
}
impl RustackS3 {
#[must_use]
pub fn new(config: S3Config) -> Self {
let storage = InMemoryStorage::new(config.s3_max_memory_object_size);
Self {
state: Arc::new(S3ServiceState::new()),
storage: Arc::new(storage),
cors_index: Arc::new(CorsIndex::new()),
config: Arc::new(config),
}
}
#[must_use]
pub fn state(&self) -> &S3ServiceState {
&self.state
}
#[must_use]
pub fn storage(&self) -> &InMemoryStorage {
&self.storage
}
#[must_use]
pub fn cors_index(&self) -> &CorsIndex {
&self.cors_index
}
#[must_use]
pub fn config(&self) -> &S3Config {
&self.config
}
pub fn reset(&self) {
self.state.reset();
self.storage.reset();
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_should_create_provider_with_defaults() {
let provider = RustackS3::new(S3Config::default());
assert_eq!(provider.config().gateway_listen, "0.0.0.0:4566");
assert!(provider.state().list_buckets().is_empty());
}
#[test]
fn test_should_debug_format_provider() {
let provider = RustackS3::new(S3Config::default());
let debug_str = format!("{provider:?}");
assert!(debug_str.contains("RustackS3"));
}
#[test]
fn test_should_share_via_arc() {
let provider = Arc::new(RustackS3::new(S3Config::default()));
let clone = Arc::clone(&provider);
assert_eq!(
provider.config().default_region,
clone.config().default_region
);
}
#[test]
fn test_should_clone_provider() {
let provider = RustackS3::new(S3Config::default());
let cloned = provider.clone();
assert_eq!(
provider.config().default_region,
cloned.config().default_region
);
}
#[test]
fn test_should_reset_state() {
let provider = RustackS3::new(S3Config::default());
provider
.state()
.create_bucket(
"test".to_owned(),
"us-east-1".to_owned(),
crate::state::object::Owner::default(),
)
.unwrap_or_else(|e| panic!("create failed: {e}"));
assert!(provider.state().bucket_exists("test"));
provider.reset();
assert!(!provider.state().bucket_exists("test"));
}
}