#![allow(dead_code)]
use crate::model::sip::{Call, CallState, Outcome};
pub fn compute_pdd_ms(call: &Call) -> Option<u32> {
let invite = call.invite_ts?;
let provisional = call.ringing_ts.or(call.trying_ts)?;
Some(((provisional - invite) / 1000) as u32)
}
pub fn compute_setup_ms(call: &Call) -> Option<u32> {
let invite = call.invite_ts?;
let answer = call.answer_ts?;
Some(((answer - invite) / 1000) as u32)
}
pub fn classify_outcome(call: &Call) -> Outcome {
match call.state {
CallState::Completed => Outcome::Answered,
CallState::Canceled => Outcome::Canceled,
CallState::Failed => match call.hangup.code {
Some(c) if (400..500).contains(&c) => Outcome::Rejected,
Some(487) => Outcome::Canceled,
_ => Outcome::Failed,
},
_ => Outcome::InProgress,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn pdd_and_setup_from_timestamps() {
let mut c = Call::new("x".into());
c.invite_ts = Some(1_000_000);
c.ringing_ts = Some(1_150_000);
c.answer_ts = Some(2_000_000);
assert_eq!(compute_pdd_ms(&c), Some(150));
assert_eq!(compute_setup_ms(&c), Some(1000));
}
}