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) to: String,
13 pub(super) context: String,
14}
15
16pub(super) fn parse_dialplan_context(detail: &str) -> Option<&str> {
22 let rest = detail.strip_prefix("parsing [")?;
23 let bracket_end = rest.find(']')?;
24 let inner = &rest[..bracket_end];
25 let arrow = inner.find("->")?;
26 Some(&inner[..arrow])
27}
28
29pub(super) fn parse_processing_line(msg: &str) -> Option<DialplanContext> {
30 let parts = processing_parts(msg)?;
31 Some(DialplanContext {
32 from: msg[parts.head].to_string(),
33 to: msg[parts.dest].to_string(),
34 context: msg[parts.context].to_string(),
35 })
36}
37
38pub(super) fn parse_new_channel(detail: &str) -> Option<&str> {
39 new_channel_name(detail)
40}
41
42pub(super) enum StateChange<'a> {
44 Channel(&'a str),
45 Call(&'a str),
46}
47
48pub(super) fn parse_state_change(detail: &str) -> Option<StateChange<'_>> {
51 let arrow = detail.find(" -> ")?;
52 let to = detail[arrow + 4..].trim();
53 if detail.contains("Callstate Change") {
54 Some(StateChange::Call(to))
55 } else {
56 Some(StateChange::Channel(to))
57 }
58}
59
60pub(super) fn parse_hangup(detail: &str) -> Option<&str> {
63 let start = detail.rfind('[')?;
64 let end = detail[start..].find(']')?;
65 Some(&detail[start + 1..start + end])
66}
67
68pub fn parse_bridge_args(arguments: &str) -> Option<BridgeInfo> {
75 let dial = BridgeDialString::from_str(arguments).ok()?;
76 let first_ep = dial.groups().first()?.first()?;
77 let origination_uuid = first_ep
80 .variables()
81 .and_then(|v| v.get("origination_uuid"))
82 .or_else(|| dial.variables().and_then(|v| v.get("origination_uuid")))
83 .map(|s| s.to_string());
84 let mut bare = first_ep.clone();
85 bare.set_variables(None);
86 let target_channel = bare.to_string();
87 Some(BridgeInfo {
88 origination_uuid,
89 target_channel,
90 })
91}
92
93#[derive(Debug, Clone, PartialEq, Eq)]
95#[non_exhaustive]
96pub struct BridgeInfo {
97 pub origination_uuid: Option<String>,
99 pub target_channel: String,
102}