use crate::Result;
use tokio::sync::mpsc;
use std::fmt;
#[derive(Debug, Clone)]
pub enum SessionEvent {
Created { session_id: String },
MessageAdded {
session_id: String,
message_id: String
},
Closed { session_id: String },
}
#[derive(Debug, Clone)]
pub enum FilesystemEvent {
FileCreated { uri: String },
FileModified { uri: String },
FileDeleted { uri: String },
}
#[derive(Debug, Clone)]
pub enum CortexEvent {
Session(SessionEvent),
Filesystem(FilesystemEvent),
}
impl fmt::Display for CortexEvent {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
CortexEvent::Session(event) => match event {
SessionEvent::Created { session_id } => {
write!(f, "SessionCreated({})", session_id)
}
SessionEvent::MessageAdded { session_id, message_id } => {
write!(f, "MessageAdded({}, {})", session_id, message_id)
}
SessionEvent::Closed { session_id } => {
write!(f, "SessionClosed({})", session_id)
}
},
CortexEvent::Filesystem(event) => match event {
FilesystemEvent::FileCreated { uri } => {
write!(f, "FileCreated({})", uri)
}
FilesystemEvent::FileModified { uri } => {
write!(f, "FileModified({})", uri)
}
FilesystemEvent::FileDeleted { uri } => {
write!(f, "FileDeleted({})", uri)
}
},
}
}
}
#[derive(Clone)]
pub struct EventBus {
tx: mpsc::UnboundedSender<CortexEvent>,
}
impl EventBus {
pub fn new() -> (Self, mpsc::UnboundedReceiver<CortexEvent>) {
let (tx, rx) = mpsc::unbounded_channel();
(Self { tx }, rx)
}
pub fn publish(&self, event: CortexEvent) -> Result<()> {
self.tx
.send(event)
.map_err(|e| crate::Error::Other(format!("Failed to publish event: {}", e)))
}
}
impl Default for EventBus {
fn default() -> Self {
let (bus, _) = Self::new();
bus
}
}