1use std::ffi::OsStr;
2
3const DEFAULT_CAPACITY: usize = 392;
4
5#[derive(Debug, PartialEq)]
6pub struct StringBuilder {
7 chars: Vec<char>
8}
9
10impl StringBuilder {
11 pub fn new() -> StringBuilder {
14 StringBuilder::with_capacity(DEFAULT_CAPACITY)
15 }
16
17 pub fn with_capacity(size: usize) -> StringBuilder {
21 StringBuilder {
22 chars: Vec::with_capacity(size),
23 }
24 }
25
26 pub fn append<T: Vcharsable>(&mut self, buff: T) -> &mut StringBuilder {
36 self.chars.append(buff.vechars().as_mut());
37 self
38 }
39
40 pub fn len(&self) -> usize {
54 self.chars.len()
55 }
56
57 pub fn delete_at(&mut self, start: usize) -> &mut StringBuilder {
70 self.delete(start, start + 1)
71 }
72
73 pub fn delete(&mut self, start: usize, end: usize) -> &mut StringBuilder {
86 if end == 0 {
87 panic!("end index must be greater then 0. end: {}", end);
88 }
89 if end <= start {
90 panic!("End index must be greater than start. start: {} end: {}", start, end);
91 }
92 if end > self.chars.len() {
93 panic!("Out of index range. end: {}", end);
94 }
95 for _i in start..end {
96 self.chars.remove(start);
97 }
98 self
99 }
100
101 pub fn clear(&mut self) -> &mut StringBuilder {
113 self.chars.clear();
114 self
115 }
116
117 pub fn string(&self) -> String {
129 self.chars.clone().into_iter().collect()
130 }
131
132 pub fn is_empty(&self) -> bool {
143 self.len() == 0
144 }
145}
146
147impl ToString for StringBuilder {
148 fn to_string(&self) -> String {
149 self.string()
150 }
151}
152
153pub trait Vcharsable {
154 fn vechars(&self) -> Vec<char>;
155}
156
157impl Vcharsable for StringBuilder {
158 fn vechars(&self) -> Vec<char> {
159 self.string().chars().collect()
160 }
161}
162
163impl Vcharsable for String {
164 fn vechars(&self) -> Vec<char> {
165 self.chars().collect()
166 }
167}
168
169impl Vcharsable for OsStr {
170 fn vechars(&self) -> Vec<char> {
171 self.to_str().unwrap().chars().collect()
172 }
173}
174
175impl<'a> Vcharsable for &'a str {
176 fn vechars(&self) -> Vec<char> {
177 self.chars().collect()
178 }
179}
180
181impl Vcharsable for char {
182 fn vechars(&self) -> Vec<char> {
183 let mut vec = Vec::with_capacity(1);
184 vec.push(*self);
185 vec
186 }
187}
188
189impl Vcharsable for bool {
190 fn vechars(&self) -> Vec<char> {
191 if *self {
192 let mut vec = Vec::with_capacity(4);
193 vec.push('t');
194 vec.push('r');
195 vec.push('u');
196 vec.push('e');
197 return vec;
198 }
199
200 let mut vec = Vec::with_capacity(5);
201 vec.push('f');
202 vec.push('a');
203 vec.push('l');
204 vec.push('s');
205 vec.push('e');
206 vec
207 }
208}
209
210impl Vcharsable for usize {
211 fn vechars(&self) -> Vec<char> {
212 let num_str: String = self.to_string();
213 let mut vec = Vec::with_capacity(num_str.len());
214 num_str.chars().for_each(|ch| vec.push(ch));
215 vec
216 }
217}
218
219impl Vcharsable for u8 {
220 fn vechars(&self) -> Vec<char> {
221 let num_str: String = self.to_string();
222 let mut vec = Vec::with_capacity(num_str.len());
223 num_str.chars().for_each(|ch| vec.push(ch));
224 vec
225 }
226}
227
228impl Vcharsable for u16 {
229 fn vechars(&self) -> Vec<char> {
230 let num_str: String = self.to_string();
231 let mut vec = Vec::with_capacity(num_str.len());
232 num_str.chars().for_each(|ch| vec.push(ch));
233 vec
234 }
235}
236
237impl Vcharsable for u32 {
238 fn vechars(&self) -> Vec<char> {
239 let num_str: String = self.to_string();
240 let mut vec = Vec::with_capacity(num_str.len());
241 num_str.chars().for_each(|ch| vec.push(ch));
242 vec
243 }
244}
245
246impl Vcharsable for u64 {
247 fn vechars(&self) -> Vec<char> {
248 let num_str: String = self.to_string();
249 let mut vec = Vec::with_capacity(num_str.len());
250 num_str.chars().for_each(|ch| vec.push(ch));
251 vec
252 }
253}
254
255impl Vcharsable for u128 {
256 fn vechars(&self) -> Vec<char> {
257 let num_str: String = self.to_string();
258 let mut vec = Vec::with_capacity(num_str.len());
259 num_str.chars().for_each(|ch| vec.push(ch));
260 vec
261 }
262}
263
264impl Vcharsable for isize {
265 fn vechars(&self) -> Vec<char> {
266 let num_str: String = self.to_string();
267 let mut vec = Vec::with_capacity(num_str.len());
268 num_str.chars().for_each(|ch| vec.push(ch));
269 vec
270 }
271}
272
273impl Vcharsable for i8 {
274 fn vechars(&self) -> Vec<char> {
275 let num_str: String = self.to_string();
276 let mut vec = Vec::with_capacity(num_str.len());
277 num_str.chars().for_each(|ch| vec.push(ch));
278 vec
279 }
280}
281
282impl Vcharsable for i16 {
283 fn vechars(&self) -> Vec<char> {
284 let num_str: String = self.to_string();
285 let mut vec = Vec::with_capacity(num_str.len());
286 num_str.chars().for_each(|ch| vec.push(ch));
287 vec
288 }
289}
290
291impl Vcharsable for i32 {
292 fn vechars(&self) -> Vec<char> {
293 let num_str: String = self.to_string();
294 let mut vec = Vec::with_capacity(num_str.len());
295 num_str.chars().for_each(|ch| vec.push(ch));
296 vec
297 }
298}
299
300impl Vcharsable for i64 {
301 fn vechars(&self) -> Vec<char> {
302 let num_str: String = self.to_string();
303 let mut vec = Vec::with_capacity(num_str.len());
304 num_str.chars().for_each(|ch| vec.push(ch));
305 vec
306 }
307}
308
309impl Vcharsable for i128 {
310 fn vechars(&self) -> Vec<char> {
311 let num_str: String = self.to_string();
312 let mut vec = Vec::with_capacity(num_str.len());
313 num_str.chars().for_each(|ch| vec.push(ch));
314 vec
315 }
316}
317
318impl Vcharsable for f32 {
319 fn vechars(&self) -> Vec<char> {
320 let num_str: String = self.to_string();
321 let mut vec = Vec::with_capacity(num_str.len());
322 num_str.chars().for_each(|ch| vec.push(ch));
323 vec
324 }
325}
326
327impl Vcharsable for f64 {
328 fn vechars(&self) -> Vec<char> {
329 let num_str: String = self.to_string();
330 let mut vec = Vec::with_capacity(num_str.len());
331 num_str.chars().for_each(|ch| vec.push(ch));
332 vec
333 }
334}