chap 2.5.0

Chap is an easy to learn, interpretive, scripting language written in Rust
Documentation
pub fn string_safe_split(inp: &str, pattern: String) -> Vec<&str> {
    let mut result: Vec<&str> = vec![];

    let mut quotations_on_left = 0;
    let mut last_seen = 0;
    for (i, ch) in inp.chars().enumerate() {
        if ch == '\"' {
            quotations_on_left += 1;
        }
        let token = &inp[i..];
        if token.starts_with(&pattern) && quotations_on_left % 2 == 0 {
            result.push(&inp[last_seen..i]);
            last_seen = i + pattern.len();
        }
    }
    result.push(&inp[last_seen..]);

    result
}

#[cfg(test)]
mod tests {
    use crate::common::splitter::string_safe_split;

    #[test]
    fn comma_splitter_test() {
        assert_eq!(
            string_safe_split("ali,hasan,majid", ",".to_string()),
            vec!["ali", "hasan", "majid"]
        );
        assert_eq!(
            string_safe_split("\"ali,hasan\",majid", ",".to_string()),
            vec!["\"ali,hasan\"", "majid"]
        );
    }

    #[test]
    fn split_longer_pattern() {
        assert_eq!(
            string_safe_split("1 -> print -> $a ", "->".to_string()),
            vec!["1 ", " print ", " $a "]
        );
    }
}