use async_trait::async_trait;
use std::fmt::Debug;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub enum PresenceEvent {
LoggedIn,
LoggedOut,
}
#[derive(Debug, Clone)]
pub enum DataEvent {
Got {
path: String,
bytes: u64,
},
Put {
path: String,
bytes: u64,
},
Deleted {
path: String,
},
MadeDir {
path: String,
},
RemovedDir {
path: String,
},
Renamed {
from: String,
to: String,
},
}
#[derive(Debug, Clone)]
pub struct EventMeta {
pub username: String,
pub trace_id: String,
pub sequence_number: u64,
}
#[async_trait]
pub trait DataListener: Sync + Send + Debug {
async fn receive_data_event(&self, e: DataEvent, m: EventMeta);
}
#[async_trait]
pub trait PresenceListener: Sync + Send + Debug {
async fn receive_presence_event(&self, e: PresenceEvent, m: EventMeta);
}
#[async_trait]
impl DataListener for Box<dyn DataListener> {
async fn receive_data_event(&self, e: DataEvent, m: EventMeta) {
self.as_ref().receive_data_event(e, m).await
}
}
#[async_trait]
impl PresenceListener for Box<dyn PresenceListener> {
async fn receive_presence_event(&self, e: PresenceEvent, m: EventMeta) {
self.as_ref().receive_presence_event(e, m).await
}
}
#[async_trait]
impl DataListener for Arc<dyn DataListener> {
async fn receive_data_event(&self, e: DataEvent, m: EventMeta) {
self.as_ref().receive_data_event(e, m).await
}
}
#[async_trait]
impl PresenceListener for Arc<dyn PresenceListener> {
async fn receive_presence_event(&self, e: PresenceEvent, m: EventMeta) {
self.as_ref().receive_presence_event(e, m).await
}
}