cutter/
lib.rs

1pub const CM_FIRST: i8 = 1;
2pub const CM_LAST: i8 = 2;
3pub const CM_RANGE: i8 = 3;
4
5// cut text between start & finish text parts, mode of cutting can be selected
6// cm_first will find first, cm_last will search from end, cm_range will cut between first & last
7// if only extract and don`t change the input, copyonly must be "true"
8pub 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
69// this will cut all appropriate parts
70pub 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}