Skip to main content

HeaderLookup

Trait HeaderLookup 

Source
pub trait HeaderLookup: SipHeaderLookup {
Show 40 methods // Required methods fn header_str(&self, name: &str) -> Option<&str>; fn variable_str(&self, name: &str) -> Option<&str>; // Provided methods fn header(&self, name: EventHeader) -> Option<&str> { ... } fn variable(&self, name: impl VariableName) -> Option<&str> { ... } fn unique_id(&self) -> Option<&str> { ... } fn job_uuid(&self) -> Option<&str> { ... } fn channel_name(&self) -> Option<&str> { ... } fn caller_id_number(&self) -> Option<&str> { ... } fn caller_id_name(&self) -> Option<&str> { ... } fn destination_number(&self) -> Option<&str> { ... } fn callee_id_number(&self) -> Option<&str> { ... } fn callee_id_name(&self) -> Option<&str> { ... } fn channel_presence_id(&self) -> Option<&str> { ... } fn presence_call_direction( &self, ) -> Result<Option<CallDirection>, ParseCallDirectionError> { ... } fn event_date_timestamp(&self) -> Option<&str> { ... } fn event_sequence(&self) -> Option<&str> { ... } fn dtmf_duration(&self) -> Option<&str> { ... } fn dtmf_source(&self) -> Option<&str> { ... } fn hangup_cause(&self) -> Result<Option<HangupCause>, ParseHangupCauseError> { ... } fn event_subclass(&self) -> Option<&str> { ... } fn sofia_event_subclass( &self, ) -> Result<Option<SofiaEventSubclass>, ParseSofiaEventSubclassError> { ... } fn gateway(&self) -> Option<&str> { ... } fn profile_name(&self) -> Option<&str> { ... } fn phrase(&self) -> Option<&str> { ... } fn sip_status_code(&self) -> Result<Option<u16>, ParseIntError> { ... } fn gateway_reg_state( &self, ) -> Result<Option<GatewayRegState>, ParseGatewayRegStateError> { ... } fn gateway_ping_status( &self, ) -> Result<Option<GatewayPingStatus>, ParseGatewayPingStatusError> { ... } fn sip_user_ping_status( &self, ) -> Result<Option<SipUserPingStatus>, ParseSipUserPingStatusError> { ... } fn pl_data(&self) -> Option<&str> { ... } fn sip_event(&self) -> Option<&str> { ... } fn gateway_name(&self) -> Option<&str> { ... } fn channel_state( &self, ) -> Result<Option<ChannelState>, ParseChannelStateError> { ... } fn channel_state_number( &self, ) -> Result<Option<ChannelState>, ParseChannelStateError> { ... } fn call_state(&self) -> Result<Option<CallState>, ParseCallStateError> { ... } fn answer_state(&self) -> Result<Option<AnswerState>, ParseAnswerStateError> { ... } fn call_direction( &self, ) -> Result<Option<CallDirection>, ParseCallDirectionError> { ... } fn priority(&self) -> Result<Option<EslEventPriority>, ParsePriorityError> { ... } fn timetable( &self, prefix: &str, ) -> Result<Option<ChannelTimetable>, ParseTimetableError> { ... } fn caller_timetable( &self, ) -> Result<Option<ChannelTimetable>, ParseTimetableError> { ... } fn other_leg_timetable( &self, ) -> Result<Option<ChannelTimetable>, ParseTimetableError> { ... }
}
Expand description

Trait for looking up ESL headers and channel variables from any key-value store.

Implementors provide two methods – header_str(&str) and variable_str(&str) – and get all typed accessors (channel_state(), call_direction(), timetable(), etc.) as default implementations.

HeaderLookup: SipHeaderLookup — every HeaderLookup implementor must also implement sip_header::SipHeaderLookup so callers can reach the typed RFC SIP parsers (call_info(), history_info(), geolocation()) directly from the same value. For stores that treat ESL headers and SIP headers as the same flat key-value namespace, a one-line delegation from sip_header_str to header_str is the intended impl — see EslEvent for the pattern. Stores with FreeSWITCH-specific transport encoding (ARRAY, [bracket] wrapping) should use EslHeaders, which overrides the SipHeaderLookup parsers to strip those quirks.

This trait must be in scope to call its methods on EslEvent – including unique_id(), hangup_cause(), and channel_state(). Import it directly or via the prelude:

use freeswitch_esl_tokio::prelude::*;
// or: use freeswitch_esl_tokio::HeaderLookup;
// or: use freeswitch_types::HeaderLookup;

§Example

use std::collections::HashMap;
use freeswitch_types::{HeaderLookup, EventHeader, ChannelVariable};
use freeswitch_types::sip_header::SipHeaderLookup;

struct MyStore(HashMap<String, String>);

// HeaderLookup has SipHeaderLookup as a supertrait. For stores that
// treat ESL and SIP headers as one flat namespace, delegate
// sip_header_str to the same lookup.
impl SipHeaderLookup for MyStore {
    fn sip_header_str(&self, name: &str) -> Option<&str> {
        self.0.get(name).map(|s| s.as_str())
    }
}

impl HeaderLookup for MyStore {
    fn header_str(&self, name: &str) -> Option<&str> {
        self.0.get(name).map(|s| s.as_str())
    }
    fn variable_str(&self, name: &str) -> Option<&str> {
        self.0.get(&format!("variable_{}", name)).map(|s| s.as_str())
    }
}

let mut map = HashMap::new();
map.insert("Channel-State".into(), "CS_EXECUTE".into());
map.insert("variable_read_codec".into(), "PCMU".into());
let store = MyStore(map);

// Typed accessor from the trait (returns Result<Option<T>, E>):
assert!(store.channel_state().unwrap().is_some());

// Enum-based lookups:
assert_eq!(store.header(EventHeader::ChannelState), Some("CS_EXECUTE"));
assert_eq!(store.variable(ChannelVariable::ReadCodec), Some("PCMU"));

Required Methods§

Source

fn header_str(&self, name: &str) -> Option<&str>

Look up a header by its raw wire name (e.g. "Unique-ID").

Source

fn variable_str(&self, name: &str) -> Option<&str>

Look up a channel variable by its bare name (e.g. "sip_call_id").

Implementations typically prepend variable_ and delegate to header_str.

Provided Methods§

Source

fn header(&self, name: EventHeader) -> Option<&str>

Look up a header by its EventHeader enum variant.

Source

fn variable(&self, name: impl VariableName) -> Option<&str>

Look up a channel variable by its typed enum variant.

Source

fn unique_id(&self) -> Option<&str>

Unique-ID header, falling back to Caller-Unique-ID.

Source

fn job_uuid(&self) -> Option<&str>

Job-UUID header from bgapi BACKGROUND_JOB events.

Source

fn channel_name(&self) -> Option<&str>

Channel-Name header (e.g. sofia/internal/1000@domain).

Source

fn caller_id_number(&self) -> Option<&str>

Caller-Caller-ID-Number header.

Source

fn caller_id_name(&self) -> Option<&str>

Caller-Caller-ID-Name header.

Source

fn destination_number(&self) -> Option<&str>

Caller-Destination-Number header.

Source

fn callee_id_number(&self) -> Option<&str>

Caller-Callee-ID-Number header.

Source

fn callee_id_name(&self) -> Option<&str>

Caller-Callee-ID-Name header.

Source

fn channel_presence_id(&self) -> Option<&str>

Channel-Presence-ID header (e.g. 1000@example.com).

Source

fn presence_call_direction( &self, ) -> Result<Option<CallDirection>, ParseCallDirectionError>

Presence-Call-Direction header, parsed into a CallDirection.

Source

fn event_date_timestamp(&self) -> Option<&str>

Event-Date-Timestamp header (microseconds since epoch).

Source

fn event_sequence(&self) -> Option<&str>

Event-Sequence header (sequential event counter).

Source

fn dtmf_duration(&self) -> Option<&str>

DTMF-Duration header (digit duration in milliseconds).

Source

fn dtmf_source(&self) -> Option<&str>

DTMF-Source header (e.g. rtp, inband).

Source

fn hangup_cause(&self) -> Result<Option<HangupCause>, ParseHangupCauseError>

Parse the Hangup-Cause header into a HangupCause.

Returns Ok(None) if the header is absent, Err if present but unparseable.

Source

fn event_subclass(&self) -> Option<&str>

Event-Subclass header for CUSTOM events (e.g. sofia::register).

Source

fn sofia_event_subclass( &self, ) -> Result<Option<SofiaEventSubclass>, ParseSofiaEventSubclassError>

Parse Event-Subclass as a typed SofiaEventSubclass.

Returns Ok(None) if the header is absent, Err if present but not a recognized sofia::* subclass.

Source

fn gateway(&self) -> Option<&str>

Gateway header from sofia::gateway_state / sofia::gateway_add events.

Source

fn profile_name(&self) -> Option<&str>

profile-name header from sofia::sip_user_state events.

Source

fn phrase(&self) -> Option<&str>

Phrase header (SIP reason phrase) from sofia state events.

Source

fn sip_status_code(&self) -> Result<Option<u16>, ParseIntError>

Status header (SIP response code) from sofia::gateway_state and sofia::sip_user_state events.

Source

fn gateway_reg_state( &self, ) -> Result<Option<GatewayRegState>, ParseGatewayRegStateError>

Parse the State header as a GatewayRegState.

Returns Ok(None) if absent, Err if present but unparseable.

Source

fn gateway_ping_status( &self, ) -> Result<Option<GatewayPingStatus>, ParseGatewayPingStatusError>

Parse Ping-Status as a GatewayPingStatus.

Use on sofia::gateway_state events. For sofia::sip_user_state, use sip_user_ping_status() instead.

Source

fn sip_user_ping_status( &self, ) -> Result<Option<SipUserPingStatus>, ParseSipUserPingStatusError>

Parse Ping-Status as a SipUserPingStatus.

Use on sofia::sip_user_state events. For sofia::gateway_state, use gateway_ping_status() instead.

Source

fn pl_data(&self) -> Option<&str>

pl_data header – SIP NOTIFY body content from NOTIFY_IN events.

Contains the JSON payload (already percent-decoded by the ESL parser). For NG9-1-1 events this is the inner object without the wrapper key (FreeSWITCH strips it).

Source

fn sip_event(&self) -> Option<&str>

event header – SIP event package name from NOTIFY_IN events.

Examples: emergency-AbandonedCall, emergency-ServiceState.

Source

fn gateway_name(&self) -> Option<&str>

gateway_name header – gateway that received a SIP NOTIFY.

Source

fn channel_state(&self) -> Result<Option<ChannelState>, ParseChannelStateError>

Parse the Channel-State header into a ChannelState.

Returns Ok(None) if the header is absent, Err if present but unparseable.

Source

fn channel_state_number( &self, ) -> Result<Option<ChannelState>, ParseChannelStateError>

Parse the Channel-State-Number header into a ChannelState.

Returns Ok(None) if the header is absent, Err if present but unparseable.

Source

fn call_state(&self) -> Result<Option<CallState>, ParseCallStateError>

Parse the Channel-Call-State header into a CallState.

Returns Ok(None) if the header is absent, Err if present but unparseable.

Source

fn answer_state(&self) -> Result<Option<AnswerState>, ParseAnswerStateError>

Parse the Answer-State header into an AnswerState.

Returns Ok(None) if the header is absent, Err if present but unparseable.

Source

fn call_direction( &self, ) -> Result<Option<CallDirection>, ParseCallDirectionError>

Parse the Call-Direction header into a CallDirection.

Returns Ok(None) if the header is absent, Err if present but unparseable.

Source

fn priority(&self) -> Result<Option<EslEventPriority>, ParsePriorityError>

Parse the priority header value.

Returns Ok(None) if the header is absent, Err if present but unparseable.

Source

fn timetable( &self, prefix: &str, ) -> Result<Option<ChannelTimetable>, ParseTimetableError>

Extract timetable from timestamp headers with the given prefix.

Returns Ok(None) if no timestamp headers with this prefix are present. Returns Err if a header is present but contains an invalid value.

Source

fn caller_timetable( &self, ) -> Result<Option<ChannelTimetable>, ParseTimetableError>

Caller-leg channel timetable (Caller-*-Time headers).

Source

fn other_leg_timetable( &self, ) -> Result<Option<ChannelTimetable>, ParseTimetableError>

Other-leg channel timetable (Other-Leg-*-Time headers).

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementations on Foreign Types§

Source§

impl HeaderLookup for HashMap<String, String>

Source§

fn header_str(&self, name: &str) -> Option<&str>

Source§

fn variable_str(&self, name: &str) -> Option<&str>

Implementors§