freeswitch_log_parser/session/
parse.rs1use std::str::FromStr;
4
5use freeswitch_types::{BridgeDialString, DialString};
6
7use crate::fields::processing_parts;
8use crate::message::new_channel_name;
9
10pub(super) struct DialplanContext {
11 pub(super) from: String,
12 pub(super) from_name: Option<String>,
14 pub(super) from_number: Option<String>,
16 pub(super) to: String,
17 pub(super) context: String,
18}
19
20pub(super) fn parse_dialplan_context(detail: &str) -> Option<&str> {
26 let rest = detail.strip_prefix("parsing [")?;
27 let bracket_end = rest.find(']')?;
28 let inner = &rest[..bracket_end];
29 let arrow = inner.find("->")?;
30 Some(&inner[..arrow])
31}
32
33pub(super) fn parse_processing_line(msg: &str) -> Option<DialplanContext> {
34 let parts = processing_parts(msg)?;
35 Some(DialplanContext {
36 from: msg[parts.head].to_string(),
37 from_name: parts.name.map(|r| msg[r].to_string()),
38 from_number: parts.number.map(|r| msg[r].to_string()),
39 to: msg[parts.dest].to_string(),
40 context: msg[parts.context].to_string(),
41 })
42}
43
44pub(super) fn parse_new_channel(detail: &str) -> Option<&str> {
45 new_channel_name(detail)
46}
47
48pub(super) enum StateChange<'a> {
50 Channel(&'a str),
51 Call(&'a str),
52}
53
54pub(super) fn parse_state_change(detail: &str) -> Option<StateChange<'_>> {
57 let arrow = detail.find(" -> ")?;
58 let to = detail[arrow + 4..].trim();
59 if detail.contains("Callstate Change") {
60 Some(StateChange::Call(to))
61 } else {
62 Some(StateChange::Channel(to))
63 }
64}
65
66pub(super) fn parse_hangup(detail: &str) -> Option<&str> {
69 let start = detail.rfind('[')?;
70 let end = detail[start..].find(']')?;
71 Some(&detail[start + 1..start + end])
72}
73
74pub fn parse_bridge_args(arguments: &str) -> Option<BridgeInfo> {
81 let dial = BridgeDialString::from_str(arguments).ok()?;
82 let first_ep = dial.groups().first()?.first()?;
83 let origination_uuid = first_ep
86 .variables()
87 .and_then(|v| v.get("origination_uuid"))
88 .or_else(|| dial.variables().and_then(|v| v.get("origination_uuid")))
89 .map(|s| s.to_string());
90 let mut bare = first_ep.clone();
91 bare.set_variables(None);
92 let target_channel = bare.to_string();
93 Some(BridgeInfo {
94 origination_uuid,
95 target_channel,
96 })
97}
98
99#[derive(Debug, Clone, PartialEq, Eq)]
101#[non_exhaustive]
102pub struct BridgeInfo {
103 pub origination_uuid: Option<String>,
105 pub target_channel: String,
108}