string_patterns/
pattern_split.rs1use crate::pattern_cache::with_cached_regex;
2use regex::Error;
3
4pub trait PatternSplit {
6 fn pattern_split_result(&self, pattern: &str, case_sensitive: bool) -> Result<Vec<String>, Error>;
9
10 fn pattern_split_pair_result(&self, pattern: &str, case_sensitive: bool) -> Result<(String, String), Error>;
13
14 fn pattern_split(&self, pattern: &str, case_sensitive: bool) -> Vec<String> {
17 match self.pattern_split_result(pattern, case_sensitive) {
18 Ok(parts) => parts,
19 Err(_error) => vec![],
20 }
21 }
22
23 fn pattern_split_ci(&self, pattern: &str) -> Vec<String> {
26 self.pattern_split(pattern, true)
27 }
28
29 fn pattern_split_cs(&self, pattern: &str) -> Vec<String> {
32 self.pattern_split(pattern, false)
33 }
34
35 fn pattern_split_pair(&self, pattern: &str, case_sensitive: bool) -> (String, String) {
38 match self.pattern_split_pair_result(pattern, case_sensitive) {
39 Ok(parts) => parts,
40 Err(_error) => ("".to_owned(), "".to_owned()),
41 }
42 }
43
44 fn pattern_split_pair_ci(&self, pattern: &str) -> (String, String) {
47 self.pattern_split_pair(pattern, true)
48 }
49
50 fn pattern_split_pair_cs(&self, pattern: &str) -> (String, String) {
53 self.pattern_split_pair(pattern, false)
54 }
55
56}
57
58impl<T: AsRef<str>> PatternSplit for T {
60
61 fn pattern_split_result(&self, pattern: &str, case_sensitive: bool) -> Result<Vec<String>, Error> {
63 with_cached_regex(pattern, case_sensitive, |regex| {
64 regex.split(self.as_ref()).into_iter().map(|s| s.to_string()).collect::<Vec<String>>()
65 })
66 }
67
68 fn pattern_split_pair_result(&self, pattern: &str, case_sensitive: bool) -> Result<(String, String), Error> {
70 with_cached_regex(pattern, case_sensitive, |regex| {
71 let parts = regex.splitn(self.as_ref(), 2).collect::<Vec<&str>>();
72 let head = parts.get(0).unwrap_or(&"").to_owned().to_string();
73 let tail = parts.get(1).unwrap_or(&"").to_owned().to_string();
74 (head, tail)
75 })
76 }
77
78}