use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum Transport {
#[default]
Udp,
Tcp,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SipAccount {
pub display_name: String,
pub username: String,
pub password: String,
pub domain: String,
pub auth_username: Option<String>,
pub server: Option<String>,
pub port: Option<u16>,
#[serde(default)]
pub transport: Transport,
}
impl SipAccount {
pub fn auth_username(&self) -> &str {
self.auth_username.as_deref().unwrap_or(&self.username)
}
pub fn server(&self) -> &str {
self.server.as_deref().unwrap_or(&self.domain)
}
pub fn port(&self) -> u16 {
self.port.unwrap_or(5060)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn make_account() -> SipAccount {
SipAccount {
display_name: "Test".to_string(),
username: "1001".to_string(),
password: "secret".to_string(),
domain: "sip.example.com".to_string(),
auth_username: None,
server: None,
port: None,
transport: Transport::default(),
}
}
#[test]
fn defaults_auth_username_to_username() {
let acct = make_account();
assert_eq!(acct.auth_username(), "1001");
}
#[test]
fn overrides_auth_username() {
let mut acct = make_account();
acct.auth_username = Some("admin".to_string());
assert_eq!(acct.auth_username(), "admin");
}
#[test]
fn defaults_server_to_domain() {
let acct = make_account();
assert_eq!(acct.server(), "sip.example.com");
}
#[test]
fn overrides_server() {
let mut acct = make_account();
acct.server = Some("10.0.0.1".to_string());
assert_eq!(acct.server(), "10.0.0.1");
}
#[test]
fn defaults_port_to_5060() {
let acct = make_account();
assert_eq!(acct.port(), 5060);
}
#[test]
fn overrides_port() {
let mut acct = make_account();
acct.port = Some(5080);
assert_eq!(acct.port(), 5080);
}
#[test]
fn default_transport_is_udp() {
assert_eq!(Transport::default(), Transport::Udp);
}
}