pub mod calls;
pub mod phone_numbers;
pub mod routing_rules;
pub mod trunks;
pub mod webhooks;
use serde::{Deserialize, Serialize};
use crate::client::Client;
use crate::common::string_enum;
pub use calls::{
CreateSipCallParams, SipCall, SipCallListParams, SipCallsResource, SwitchRoomParams,
TransferSipCallParams,
};
pub use phone_numbers::{
CreatePhoneNumbersParams, PhoneNumberInboundConfig, PhoneNumberInfo, PhoneNumberListParams,
PhoneNumberOutboundConfig, PhoneNumberWithGateways, PhoneNumbersResource,
UpdatePhoneNumberGatewayParams,
};
pub use routing_rules::{
CreateRoutingRuleParams, RoutingRuleTarget, SipRoomConfig, SipRoutingRule,
SipRoutingRuleListParams, SipRoutingRulesResource, UpdateRoutingRuleParams,
};
pub use trunks::{
CreateInboundTrunkParams, CreateOutboundTrunkParams, InboundTrunkResource,
OutboundTrunkResource, SipTrunk, SipTrunkListParams, SipTrunksResource,
UpdateInboundTrunkParams, UpdateOutboundTrunkParams,
};
pub use webhooks::{CreateSipWebhookParams, SipWebhook, SipWebhookListParams, SipWebhooksResource};
string_enum! {
SipTransport {
UDP => "udp",
TCP => "tcp",
TLS => "tls",
}
}
string_enum! {
SipMediaEncryption {
ENABLE => "enable",
DISABLE => "disable",
}
}
string_enum! {
SipIncludeHeaders {
ALL => "ALL",
SIP_X_HEADERS => "SIP_X_HEADERS",
NONE => "NONE",
}
}
string_enum! {
SipDirection {
INBOUND => "inbound",
OUTBOUND => "outbound",
}
}
string_enum! {
SipRoomType {
STATIC => "static",
DYNAMIC => "dynamic",
}
}
string_enum! {
SipRoomPrefix {
BLANK => "blank",
PARTICIPANT_NUMBER => "participantNumber",
SIP_NUMBER => "sipNumber",
RANDOM => "random",
}
}
string_enum! {
SipRegion {
AUTO => "auto",
US002 => "us002",
IN002 => "in002",
}
}
string_enum! {
SipCallStatus {
INITIATED => "initiated",
RINGING => "ringing",
MISSED => "missed",
NOT_ANSWERED => "not-answered",
FAILED => "failed",
INCOMING => "incoming",
VERIFIED => "verified",
REJECTED => "rejected",
ABANDONED => "abandoned",
ANSWERED => "answered",
ENDED => "ended",
TRANSFER_INITIATED => "transfer-initiated",
TRANSFER_ACCEPTED => "transfer-accepted",
TRANSFERRING => "transferring",
TRANSFER_RINGING => "transfer-ringing",
TRANSFERRED => "transferred",
TRANSFER_FAILED => "transfer-failed",
SWITCH_ROOM_INITIATED => "switch-room-initiated",
SWITCH_ROOM_COMPLETED => "switch-room-completed",
SWITCH_ROOM_FAILED => "switch-room-failed",
}
}
string_enum! {
SipWebhookEvent {
CALL_STARTED => "call-started",
CALL_ANSWERED => "call-answered",
CALL_HANGUP => "call-hangup",
CALL_TRANSFERRED => "call-transferred",
CALL_MISSED => "call-missed",
CALL_UPDATE => "call-update",
CALL_RINGING => "call-ringing",
CALL_TRANSFER_INITIATED => "call-transfer-initiated",
CALL_TRANSFER_ACCEPTED => "call-transfer-accepted",
CALL_TRANSFERRING => "call-transferring",
CALL_TRANSFER_RINGING => "call-transfer-ringing",
CALL_TRANSFER_FAILED => "call-transfer-failed",
SWITCH_ROOM_INITIATED => "switch-room-initiated",
SWITCH_ROOM_COMPLETED => "switch-room-completed",
SWITCH_ROOM_FAILED => "switch-room-failed",
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SipAuth {
pub username: String,
pub password: String,
}
#[derive(Debug, Clone, Copy)]
pub struct SipResource<'a> {
client: &'a Client,
}
impl<'a> SipResource<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub fn trunks(&self) -> SipTrunksResource<'a> {
SipTrunksResource::new(self.client)
}
pub fn routing_rules(&self) -> SipRoutingRulesResource<'a> {
SipRoutingRulesResource::new(self.client)
}
pub fn phone_numbers(&self) -> PhoneNumbersResource<'a> {
PhoneNumbersResource::new(self.client)
}
pub fn calls(&self) -> SipCallsResource<'a> {
SipCallsResource::new(self.client)
}
pub fn webhooks(&self) -> SipWebhooksResource<'a> {
SipWebhooksResource::new(self.client)
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
#[test]
fn string_enums_round_trip_their_wire_values() {
assert_eq!(SipTransport::TLS.as_str(), "tls");
assert_eq!(SipIncludeHeaders::SIP_X_HEADERS.as_str(), "SIP_X_HEADERS");
assert_eq!(
SipRoomPrefix::PARTICIPANT_NUMBER.as_str(),
"participantNumber"
);
assert_eq!(SipCallStatus::NOT_ANSWERED.as_str(), "not-answered");
assert_eq!(
SipWebhookEvent::SWITCH_ROOM_COMPLETED.as_str(),
"switch-room-completed"
);
assert_eq!(
serde_json::to_value(SipDirection::INBOUND).unwrap(),
json!("inbound")
);
}
#[test]
fn an_unknown_value_still_deserializes() {
let status: SipCallStatus = serde_json::from_value(json!("some-future-status")).unwrap();
assert_eq!(status.as_str(), "some-future-status");
assert_eq!(
serde_json::to_value(&status).unwrap(),
json!("some-future-status")
);
}
}