mod conference;
mod core;
mod core_media;
mod esl_array;
#[cfg(feature = "esl")]
mod esl_headers;
mod loopback;
mod sip_multipart;
mod sip_passthrough;
mod sofia;
pub use self::core::{ChannelVariable, ParseChannelVariableError};
pub use conference::{ConferenceVariable, ParseConferenceVariableError};
pub use core_media::{CoreMediaVariable, ParseCoreMediaVariableError, RtpStatUnit};
pub use esl_array::{EslArray, EslArrayError, MAX_ARRAY_ITEMS};
#[cfg(feature = "esl")]
pub use esl_headers::EslHeaders;
pub use loopback::{
LoopbackChannelName, LoopbackHangupCause, LoopbackLeg, LoopbackResignation, LoopbackVariable,
ParseLoopbackHangupCauseError, ParseLoopbackLegError, ParseLoopbackVariableError,
};
pub use sip_multipart::{MultipartBody, MultipartBodyError, MultipartItem};
pub use sip_passthrough::{
InvalidHeaderName, ParseSipPassthroughError, SipHeaderPrefix, SipPassthroughHeader,
};
pub use sofia::{CarriedHeader, ParseSofiaVariableError, SofiaVariable};
pub trait VariableName {
fn as_str(&self) -> &str;
fn header_name(&self) -> String {
crate::lookup::variable_key(self.as_str())
}
}
macro_rules! impl_variable_name {
($($enum:ident),+ $(,)?) => {
$(
impl VariableName for $enum {
fn as_str(&self) -> &str {
$enum::as_str(self)
}
}
)+
};
}
impl_variable_name!(
ChannelVariable,
SofiaVariable,
CoreMediaVariable,
LoopbackVariable,
ConferenceVariable,
);
#[cfg(test)]
mod tests {
use super::*;
use crate::{HeaderLookup, VARIABLE_PREFIX};
use sip_header::SipHeader;
use std::collections::HashMap;
#[test]
fn header_name_composes_the_wire_key() {
assert_eq!(
ChannelVariable::ReadCodec.header_name(),
"variable_read_codec"
);
assert_eq!(
LoopbackVariable::LoopbackLeg.header_name(),
"variable_loopback_leg"
);
assert!(ChannelVariable::ReadCodec
.header_name()
.starts_with(VARIABLE_PREFIX));
}
#[test]
fn header_name_covers_a_borrowed_as_str() {
let h = SipPassthroughHeader::invite(SipHeader::CallInfo);
assert_eq!(h.header_name(), "variable_sip_i_call_info");
}
#[test]
fn an_external_implementor_supplies_only_as_str() {
struct TenantVariable;
impl VariableName for TenantVariable {
fn as_str(&self) -> &str {
"tenant_id"
}
}
assert_eq!(TenantVariable.header_name(), "variable_tenant_id");
}
#[test]
fn header_name_is_the_key_a_header_store_holds() {
let mut map: HashMap<String, String> = HashMap::new();
map.insert(ChannelVariable::ReadCodec.header_name(), "PCMU".into());
assert_eq!(map.variable(ChannelVariable::ReadCodec), Some("PCMU"));
}
}