feat: add corex-storage crate for unified storage abstraction

- Introduced corex-storage crate with support for local disk, S3-compatible, and Google Cloud Storage backends.
- Implemented StorageDriver trait for various storage backends.
- Added LocalFileStorage for local disk operations.
- Added S3Storage for S3-compatible object storage with multipart upload support.
- Added GcsStorage for Google Cloud Storage operations.
- Included error handling for storage operations.
- Added tests for each storage backend to ensure functionality.
- Created README.md for documentation and usage examples.
- Added Apache and MIT licenses for open-source compliance.
This commit is contained in:
asepharyana committed 2026-08-28 22:24:18 +07:00
1 parent 6a4b2b8f54
commit db4f277336
47 files changed

No files matched your search

+60
View File
@@ -0,0 +1,60 @@
//! # corex-event
//!
//! A unified events & message bus abstraction so component-to-component (or
//! service-to-service) communication doesn't get locked to one transport.
//!
//! - **In-memory dispatcher** ([`memory::InMemoryEventBus`], feature `mem`,
//! default): a `tokio::sync::broadcast`-backed pub/sub bus for
//! intra-process communication.
//! - **Distributed broker backends**: [`amqp::AmqpEventBus`] (RabbitMQ,
//! feature `amqp`) and [`nats::NatsEventBus`] (NATS, feature `nats`) behind
//! the same [`EventBus`] trait, so swapping the backend does not change
//! handler code.
//! - **Typed convenience**: [`typed::TypedEventBus`] layers JSON
//! (de)serialization on top of the byte-oriented [`EventBus`].
//!
//! ## Example
//!
//! ```
//! use corex_event::{EventBus, InMemoryEventBus, TypedEventBus};
//! use serde::{Deserialize, Serialize};
//!
//! #[derive(Debug, Serialize, Deserialize, PartialEq)]
//! struct OrderCreated { id: u64 }
//!
//! # #[tokio::main] async fn main() {
//! let bus = TypedEventBus::new(InMemoryEventBus::default());
//! let mut sub = bus.subscribe::<OrderCreated>("orders").await.unwrap();
//! bus.publish("orders", &OrderCreated { id: 42 }).await.unwrap();
//! let event = sub.recv().await.unwrap();
//! assert_eq!(event, OrderCreated { id: 42 });
//! # }
//! ```
pub mod traits;
#[cfg(feature = "mem")]
pub mod memory;
#[cfg(feature = "mem")]
pub mod typed;
#[cfg(feature = "amqp")]
pub mod amqp;
#[cfg(feature = "nats")]
pub mod nats;
pub use traits::{EventBus, EventError, Subscription};
#[cfg(feature = "mem")]
pub use memory::InMemoryEventBus;
#[cfg(feature = "mem")]
pub use typed::{Event, TypedEventBus, TypedSubscription};
#[cfg(feature = "amqp")]
pub use amqp::AmqpEventBus;
#[cfg(feature = "nats")]
pub use nats::NatsEventBus;