use crate::call::domain::*;
use crate::callrecord::CallRecordHangupReason;
use crate::console::handlers::call_control::CallCommandPayload;
use anyhow::Result;
fn parse_hangup_reason(reason: Option<&str>) -> Option<CallRecordHangupReason> {
reason.and_then(|r| match r.to_lowercase().as_str() {
"by_caller" | "caller" => Some(CallRecordHangupReason::ByCaller),
"by_callee" | "callee" => Some(CallRecordHangupReason::ByCallee),
"by_system" | "system" => Some(CallRecordHangupReason::BySystem),
"no_answer" => Some(CallRecordHangupReason::NoAnswer),
"rejected" => Some(CallRecordHangupReason::Rejected),
"canceled" => Some(CallRecordHangupReason::Canceled),
"failed" => Some(CallRecordHangupReason::Failed),
_ => None,
})
}
pub fn console_to_call_command(
payload: CallCommandPayload,
session_id: &str,
) -> Result<CallCommand> {
match payload {
CallCommandPayload::Hangup {
reason,
code,
initiator,
} => {
let cdr_reason = parse_hangup_reason(reason.as_deref());
let mut cmd =
HangupCommand::local(initiator.as_deref().unwrap_or("console"), cdr_reason, code);
cmd = cmd.with_cascade(HangupCascade::All);
Ok(CallCommand::Hangup(cmd))
}
CallCommandPayload::Accept { callee, sdp } => {
let _ = (callee, sdp); Ok(CallCommand::Answer {
leg_id: LegId::new(session_id),
})
}
CallCommandPayload::Transfer { target } => Ok(CallCommand::Transfer {
leg_id: LegId::new(session_id),
target,
attended: false,
}),
CallCommandPayload::Mute { track_id } => Ok(CallCommand::MuteTrack { track_id }),
CallCommandPayload::Unmute { track_id } => Ok(CallCommand::UnmuteTrack { track_id }),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hangup_conversion() {
let payload = CallCommandPayload::Hangup {
reason: Some("normal_clearing".to_string()),
code: Some(200),
initiator: Some("admin".to_string()),
};
let cmd = console_to_call_command(payload, "session-123").unwrap();
if let CallCommand::Hangup(hangup_cmd) = cmd {
assert_eq!(hangup_cmd.code, Some(200));
} else {
panic!("Expected Hangup command");
}
}
#[test]
fn test_transfer_conversion() {
let payload = CallCommandPayload::Transfer {
target: "sip:1001@example.com".to_string(),
};
let cmd = console_to_call_command(payload, "session-123").unwrap();
if let CallCommand::Transfer {
leg_id,
target,
attended,
} = cmd
{
assert_eq!(leg_id.as_str(), "session-123");
assert_eq!(target, "sip:1001@example.com");
assert!(!attended);
} else {
panic!("Expected Transfer command");
}
}
#[test]
fn test_mute_conversion() {
let payload = CallCommandPayload::Mute {
track_id: "track-audio-1".to_string(),
};
let cmd = console_to_call_command(payload, "session-123").unwrap();
if let CallCommand::MuteTrack { track_id } = cmd {
assert_eq!(track_id, "track-audio-1");
} else {
panic!("Expected MuteTrack command");
}
}
}