use crate::state_table::types::SessionId;
pub type OnReferCallback = Box<dyn Fn(ReferEvent) -> CallbackResult + Send + Sync>;
pub type OnIncomingCallCallback = Box<dyn Fn(IncomingCallEvent) -> CallbackResult + Send + Sync>;
pub type OnCallTerminatedCallback = Box<dyn Fn(CallTerminatedEvent) + Send + Sync>;
pub type OnCallAnsweredCallback = Box<dyn Fn(CallAnsweredEvent) + Send + Sync>;
#[derive(Debug, Clone)]
pub struct ReferEvent {
pub refer_to: String,
pub referred_by: Option<String>,
pub replaces: Option<String>,
}
#[derive(Debug, Clone)]
pub struct IncomingCallEvent {
pub from: String,
pub to: String,
pub sdp: Option<String>,
}
#[derive(Debug, Clone)]
pub struct CallTerminatedEvent {
pub session_id: SessionId,
pub reason: String,
}
#[derive(Debug, Clone)]
pub struct CallAnsweredEvent {
pub session_id: SessionId,
pub sdp: Option<String>,
}
#[derive(Debug, Clone)]
pub enum CallbackResult {
Accept,
Reject(u16, String),
Handle,
}
#[derive(Default)]
pub struct CallbackRegistry {
pub on_refer: Option<OnReferCallback>,
pub on_incoming_call: Option<OnIncomingCallCallback>,
pub on_call_terminated: Option<OnCallTerminatedCallback>,
pub on_call_answered: Option<OnCallAnsweredCallback>,
}
impl CallbackRegistry {
pub fn new() -> Self {
Self::default()
}
pub fn has_callbacks(&self) -> bool {
self.on_refer.is_some()
|| self.on_incoming_call.is_some()
|| self.on_call_terminated.is_some()
|| self.on_call_answered.is_some()
}
pub fn clear(&mut self) {
self.on_refer = None;
self.on_incoming_call = None;
self.on_call_terminated = None;
self.on_call_answered = None;
}
}
impl CallbackResult {
pub fn accept() -> Self {
CallbackResult::Accept
}
pub fn reject_busy() -> Self {
CallbackResult::Reject(486, "Busy Here".to_string())
}
pub fn reject_not_implemented() -> Self {
CallbackResult::Reject(501, "Not Implemented".to_string())
}
pub fn reject_decline() -> Self {
CallbackResult::Reject(603, "Decline".to_string())
}
pub fn handle() -> Self {
CallbackResult::Handle
}
}