string_tools/
lib.rs

1/// Return the part of a str which is before an occurence or return None if there is no occurence.
2/// 
3/// ```
4/// use string_tools::get_all_before_strict;
5/// 
6/// assert_eq!(get_all_before_strict("azertyuiopqsdfghjklmwxcvbn", "sdf"), Some("azertyuiopq"));
7/// assert_eq!(get_all_before_strict("azertyuiopqsdfghjklmwxcvbn", "123"), None);
8/// ```
9pub fn get_all_before_strict<'a>(text: &'a str, begin: &str) -> Option<&'a str> {
10    let begin = text.find(begin)?;
11    Some(&text[..begin])
12}
13
14/// Return the part of a str which is after an occurence or return None if there is no occurence.
15/// 
16/// ```
17/// use string_tools::get_all_after_strict;
18/// 
19/// assert_eq!(get_all_after_strict("azertyuiopqsdfghjklmwxcvbn", "sdf"), Some("ghjklmwxcvbn"));
20/// assert_eq!(get_all_after_strict("azertyuiopqsdfghjklmwxcvbn", "123"), None);
21/// ```
22pub fn get_all_after_strict<'a>(text: &'a str, end: &str) -> Option<&'a str> {
23    let end = text.find(end)? + end.len();
24    Some(&text[end..])
25}
26
27/// Alias for the str find method.
28/// 
29/// ```
30/// use string_tools::get_idx_before_strict;
31/// 
32/// assert_eq!(get_idx_before_strict("azertyuiopqsdfghjklmwxcvbn", "sdf"), Some(11));
33/// assert_eq!(get_idx_before_strict("azertyuiopqsdfghjklmwxcvbn", "123"), None);
34/// ```
35pub fn get_idx_before_strict<'a>(text: &'a str, begin: &str) -> Option<usize> {
36    text.find(begin)
37}
38
39/// Return the index of an occurence. If there is no occurence, the index is the len of the text.
40/// 
41/// ```
42/// use string_tools::get_idx_before;
43/// 
44/// assert_eq!(get_idx_before("azertyuiopqsdfghjklmwxcvbn", "sdf"), 11);
45/// assert_eq!(get_idx_before("azertyuiopqsdfghjklmwxcvbn", "123"), 26);
46/// ```
47pub fn get_idx_before(text: &str, begin: &str) -> usize {
48    if let Some(idx) = text.find(begin) {
49        return idx
50    } else {
51        return text.len();
52    }
53}
54
55/// Return the index of the end of an occurence. Return None if there is no occurence.
56/// 
57/// ```
58/// use string_tools::get_idx_after_strict;
59/// 
60/// assert_eq!(get_idx_after_strict("azertyuiopqsdfghjklmwxcvbn", "sdf"), Some(14));
61/// assert_eq!(get_idx_after_strict("azertyuiopqsdfghjklmwxcvbn", "123"), None);
62/// ```
63pub fn get_idx_after_strict<'a>(text: &'a str, end: &str) -> Option<usize> {
64    let end = text.find(end)? + end.len();
65    Some(end)
66}
67
68/// Return the part of a str which is between two str or return None if this is not possible.
69/// 
70/// ```
71/// use string_tools::get_all_between_strict;
72/// 
73/// assert_eq!(get_all_between_strict("azertyuiopqsdfghjklmwxcvbn", "tyu", "klm"), Some("iopqsdfghj"));
74/// assert_eq!(get_all_between_strict("azertyuiopqsdfghjklmwxcvbn", "klm", "tyu"), None);
75/// ```
76pub fn get_all_between_strict<'a>(text: &'a str, begin: &str, end: &str) -> Option<&'a str> {
77    let text = get_all_after_strict(text, begin)?;
78    let text = get_all_before_strict(text, end)?;
79    Some(text)
80}
81
82pub fn get_idx_between_strict<'a>(text: &'a str, begin: &str, end: &str) -> Option<(usize, usize)> {
83    let after = get_idx_after_strict(text, begin)?;
84    let before = get_idx_before_strict(&text[after..], end)?;
85    Some((after, after + before))
86}
87
88pub fn get_all_before<'a>(text: &'a str, begin: &str) -> &'a str {
89    let begin = text.find(begin).unwrap_or(text.len());
90    &text[..begin]
91}
92
93pub fn get_all_after<'a>(text: &'a str, end: &str) -> &'a str {
94    if let Some(mut end_index) = text.find(end) {
95        end_index += end.len();
96        return &text[end_index..];
97    } else {
98        return "";
99    }
100}
101
102pub fn get_all_between<'a>(text: &'a str, begin: &str, end: &str) -> &'a str {
103    let text = get_all_after(text, begin);
104    let text = get_all_before(text, end);
105    text
106}
107
108#[cfg(test)]
109mod tests {
110    use super::*;
111
112    #[test]
113    fn string_tools_test() {
114        assert_eq!(Some("test"), get_all_before_strict("testlol", "lol"));
115        assert_eq!(Some("test"), get_all_before_strict("testloltestlol", "lol"));
116        assert_eq!(Some("lol"), get_all_after_strict("testlol", "test"));
117        assert_eq!(Some("testlol"), get_all_after_strict("testloltestlol", "lol"));
118        assert_eq!(Some("str3str4"), get_all_between_strict("str1str2str3str4str5", "str2", "str5"));
119        assert_eq!(Some("str3str4"), get_all_between_strict("str5str1str2str3str4str5str2str3str5", "str2", "str5"));
120        assert_eq!(None, get_all_before_strict("str1str2", "str3"));
121        assert_eq!("str1str2", get_all_before("str1str2", "str3"));
122        assert_eq!(None, get_all_after_strict("str1str2", "str3"));
123        assert_eq!("", get_all_after("str1str2", "str3"));
124        assert_eq!("str2str3", get_all_between("str1str2str3str4", "str1", "str4"));
125        assert_eq!("", get_all_between("str1str2str3str4", "str0", "str4"));
126        assert_eq!("str2str3str4", get_all_between("str1str2str3str4", "str1", "str6"));
127    }
128}