1pub const CM_FIRST: i8 = 1;
2pub const CM_LAST: i8 = 2;
3pub const CM_RANGE: i8 = 3;
4
5pub fn one(start: &str, finish: &str, input: &mut String, mode: i8, copyonly: bool) -> String
9{
10 let mut original = input.clone();
11 let original_static = input.clone();
12
13 if input.find(start) == None && start.len() > 0 {
14 return String::from("");
15 }
16
17 let v1: Vec<_> = original_static.match_indices(start).collect();
18 let v2: Vec<_> = original_static.match_indices(finish).collect();
19
20 let mut read_start = 0;
21 let mut read_end = 0;
22
23 let mut cut_start = 0;
24 let mut cut_end = 0;
25
26 if v1.len() > 0 {
27 for (index, _) in input.match_indices(start) {
28 cut_start = index;
29 read_start = index + start.len();
30
31 if mode == CM_FIRST || mode == CM_RANGE {
32 break;
33 }
34 }
35 }
36
37 if v2.len() > 0 {
38 for (index, _) in input.match_indices(finish) {
39 read_end = index;
40 cut_end = index + finish.len();
41 if read_end > read_start {
42 if mode == CM_FIRST || mode == CM_LAST {
43 break;
44 }
45 }
46 }
47 }
48
49 let mut result = String::from("");
50
51 if read_end > read_start && read_end > 0 {
52 let mut input_bytes: Vec<u8> = input.bytes().collect();
53 let mut result_bytes: Vec<u8> = vec![];
54 result_bytes.extend_from_slice(&input_bytes[read_start..read_end]);
55
56 result = String::from_utf8(result_bytes).unwrap();
57
58 if copyonly == false {
59 input_bytes.drain(cut_start..cut_end);
60 original = String::from_utf8(input_bytes).unwrap();
61 }
62 }
63
64 input.clear();
65 input.push_str(original.as_str());
66 return result;
67}
68
69pub fn all(start: &str, finish: &str, input: &mut String, mode: i8, copyonly: bool) -> Vec<String>
71{
72 let mut original = input.clone();
73 let mut result: Vec<String> = vec![];
74 let mut work = true;
75
76 while work == true {
77 let curr = self::one(start, finish, &mut original, mode, copyonly);
78 if curr == "" {
79 work = false;
80 } else {
81 result.push(curr);
82 }
83 }
84 input.clear();
85 input.push_str(original.as_str());
86 return result;
87}