lightstreamer_client/
util.rs

1/// Clean the message from newlines and carriage returns and convert it to lowercase. Also remove all brackets.
2pub fn clean_message(text: &str) -> String {
3    let mut result = String::new();
4    let mut inside_braces = false;
5
6    for part in text.split_inclusive(&['{', '}']) {
7        if part.starts_with('{') && part.ends_with('}') {
8            // Part is fully inside braces
9            inside_braces = true;
10            result.push_str(part);
11        } else if inside_braces {
12            // We're processing a segment after an opening brace
13            inside_braces = false;
14            result.push_str(&part);
15        } else {
16            // Process the part outside braces
17            result.push_str(&part.replace('\n', "").replace('\r', "").to_lowercase());
18        }
19    }
20
21    result
22}
23
24pub fn parse_arguments(input: &str) -> Vec<&str> {
25    let mut arguments = Vec::new();
26    let mut start = 0;
27    let mut in_brackets = 0; // Tracks nesting level for curly braces
28
29    for (i, c) in input.chars().enumerate() {
30        match c {
31            '{' => in_brackets += 1,
32            '}' => in_brackets -= 1,
33            ',' if in_brackets == 0 => {
34                // Outside of brackets, treat comma as a delimiter
35                let slice = &input[start..i].trim();
36                if !slice.is_empty() {
37                    arguments.push(*slice); // Dereference slice here
38                }
39                start = i + 1;
40            }
41            _ => {}
42        }
43    }
44
45    // Push the final argument if it's not empty
46    if start < input.len() {
47        let slice = &input[start..].trim();
48        if !slice.is_empty() {
49            arguments.push(*slice); // Dereference slice here
50        }
51    }
52
53    arguments
54}