use std::sync::Arc;
pub trait EventEmitter: Send + Sync {
fn emit(&self, event: &TransferEvent);
}
#[derive(Debug, Clone)]
pub enum TransferEvent {
Started { role: Role },
Progress {
role: Role,
processed: u64,
total: u64,
speed: f64,
},
Completed { role: Role },
Failed {
role: Role,
message: String,
},
FileNames { role: Role, file_names: Vec<String> },
}
impl TransferEvent {
pub const fn state(&self) -> &'static str {
match self {
Self::Started { .. } => "started",
Self::Progress { .. } => "progress",
Self::Completed { .. } => "completed",
Self::Failed { .. } => "failed",
Self::FileNames { .. } => "file-names",
}
}
pub const fn role(&self) -> Role {
match self {
Self::Started { role }
| Self::Completed { role }
| Self::Failed { role, .. }
| Self::Progress { role, .. }
| Self::FileNames { role, .. } => *role,
}
}
pub fn event_name(&self) -> String {
format!("transfer:{}:{}", self.role().as_str(), self.state())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Role {
Sender,
Receiver,
}
impl Role {
pub const fn as_str(&self) -> &'static str {
match self {
Self::Sender => "sender",
Self::Receiver => "receiver",
}
}
}
pub type AppHandle = Option<Arc<dyn EventEmitter>>;
pub fn emit_event(app: &AppHandle, event: &TransferEvent) {
if let Some(handle) = app {
handle.emit(event);
}
}