simple_string_patterns/
enclose.rs1use std::str::Chars;
2
3
4pub trait SimpleEnclose {
6
7 fn enclose_in_chars(& self, start: char, end: char, prefix: Option<&str>, escape_char: Option<char>) -> String;
14
15 fn enclose_escaped(& self, start: char, end: char, escape_char: Option<char>) -> String {
17 self.enclose_in_chars(start, end, None, escape_char)
18 }
19
20 fn enclose(& self, start: char, end: char) -> String {
22 self.enclose_in_chars(start, end, None, None)
23 }
24
25 fn enclose_safe(& self, start: char, end: char) -> String {
28 self.enclose_in_chars(start, end, None, Some('\\'))
29 }
30
31 fn wrap_escaped(& self, opening: char, escape_char: Option<char>) -> String {
37 let end = match opening {
38 '(' => ')',
39 '<' => '>',
40 '{' => '}',
41 '[' => ']',
42 _ => opening
43 };
44 self.enclose_in_chars(opening, end, None, escape_char)
45 }
46
47 fn wrap(& self, opening: char) -> String {
49 let end = match opening {
50 '(' => ')',
51 '<' => '>',
52 '{' => '}',
53 '[' => ']',
54 _ => opening
55 };
56 self.enclose_in_chars(opening, end, None, None)
57 }
58
59 fn wrap_safe(& self, opening: char) -> String {
61 let end = match opening {
62 '(' => ')',
63 '<' => '>',
64 '{' => '}',
65 '[' => ']',
66 _ => opening
67 };
68 self.enclose_in_chars(opening, end, None, Some('\\'))
69 }
70
71 fn in_parentheses(& self, prefix: Option<&str>) -> String {
73 self.enclose_in_chars('(', ')', prefix, None)
74 }
75
76 fn parenthesize(& self) -> String {
78 self.wrap('(')
79 }
80
81 fn parenthesize_safe(& self) -> String {
83 self.wrap_safe('(')
84 }
85
86 fn double_quotes(& self) -> String {
88 self.wrap('"')
89 }
90
91 fn single_quotes(& self) -> String {
93 self.wrap('\'')
94 }
95
96 fn double_quotes_safe(& self) -> String {
98 self.wrap_escaped('"', Some('\\'))
99 }
100
101 fn single_quotes_safe(& self) -> String {
103 self.wrap_escaped('\'', Some('\\'))
104 }
105
106}
107
108
109impl SimpleEnclose for str {
111 fn enclose_in_chars(&self, start: char, end: char, prefix: Option<&str>, escape_char: Option<char>) -> String {
112 let mut out = match escape_char {
113 Some(esc_char) => {
114 if self.contains(end) {
115 escape_in_str(self.chars(), end, esc_char)
116 } else {
117 self.to_owned()
118 }
119 },
120 _ => self.to_owned()
121 };
122 out.insert(0, start);
123 if let Some(pre) = prefix {
124 out.insert_str(1, pre);
125 }
126 out.push(end);
127 out
128 }
129}
130
131pub fn escape_in_str(chars: Chars, end: char, esc_char: char) -> String {
135 let mut new_string = String::new();
136 let mut prev_char = ' ';
137 for ch in chars {
138 if ch == end {
139 if prev_char != esc_char && new_string.len() > 0 {
141 new_string.push(esc_char);
142 }
143 }
144 new_string.push(ch);
145 prev_char = ch;
146 }
147 new_string
148}