rstring_builder/
lib.rs

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  ///
12  /// Return a new `StringBuilder` with default initial capacity.
13  pub fn new() -> StringBuilder {
14    StringBuilder::with_capacity(DEFAULT_CAPACITY)
15  }
16
17  ///
18  /// Return a new `StringBuilder` with an initial capacity.
19  ///
20  pub fn with_capacity(size: usize) -> StringBuilder {
21    StringBuilder {
22      chars: Vec::with_capacity(size),
23    }
24  }
25
26  /// Add a type that can be viewed as a slice of bytes.
27  ///
28  /// # Example
29  ///
30  /// ```rust
31  /// use rstring_builder::StringBuilder;
32  /// let mut builder = StringBuilder::new();
33  /// builder.append("some string");
34  /// ```
35  pub fn append<T: Vcharsable>(&mut self, buff: T) -> &mut StringBuilder {
36    self.chars.append(buff.vechars().as_mut());
37    self
38  }
39
40  /// Return the current length in chars of the underlying buffer.
41  ///
42  /// # Example
43  ///
44  /// ```rust
45  /// use rstring_builder::StringBuilder;
46  ///
47  /// let mut builder = StringBuilder::new();
48  /// builder.append("four");
49  /// assert_eq!(builder.len(), 4);
50  /// builder.append("華文");
51  /// assert_eq!(builder.len(), 6);
52  /// ```
53  pub fn len(&self) -> usize {
54    self.chars.len()
55  }
56
57  /// Delete chars of index
58  ///
59  /// # Example
60  ///
61  /// ```rust
62  /// use rstring_builder::StringBuilder;
63  ///
64  /// let mut builder = StringBuilder::new();
65  /// builder.append("abc");
66  /// assert_eq!("bc".to_string(), builder.delete_at(0).string());
67  /// assert_eq!("b".to_string(), builder.delete_at(1).string());
68  /// ```
69  pub fn delete_at(&mut self, start: usize) -> &mut StringBuilder {
70    self.delete(start, start + 1)
71  }
72
73  /// Delete chars range
74  ///
75  /// # Example
76  ///
77  /// ```rust
78  /// use rstring_builder::StringBuilder;
79  ///
80  /// let mut builder = StringBuilder::new();
81  /// builder.append("abc\ndef");
82  /// assert_eq!("adef".to_string(), builder.delete(1, 4).string());
83  /// assert_eq!("".to_string(), builder.delete(0, builder.len()).string());
84  /// ```
85  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  /// Clear string builder.
102  ///
103  /// # Example
104  ///
105  /// ```rust
106  /// use rstring_builder::StringBuilder;
107  ///
108  /// let mut builder = StringBuilder::new();
109  /// builder.append("abc\ndef");
110  /// assert_eq!("".to_string(), builder.clear().string());
111  /// ```
112  pub fn clear(&mut self) -> &mut StringBuilder {
113    self.chars.clear();
114    self
115  }
116
117  /// Return String
118  ///
119  /// # Example
120  ///
121  /// ```rust
122  /// use rstring_builder::StringBuilder;
123  ///
124  /// let mut builder = StringBuilder::new();
125  /// builder.append("abc\ndef");
126  /// assert_eq!("abc\ndef".to_string(), builder.string());
127  /// ```
128  pub fn string(&self) -> String {
129    self.chars.clone().into_iter().collect()
130  }
131
132  /// text builder is empty
133  ///  # Example
134  /// ```rust
135  /// use rstring_builder::StringBuilder;
136  ///
137  /// let mut builder = StringBuilder::new();
138  /// assert_eq!(true, builder.is_empty());
139  /// builder.append("abc\ndef");
140  /// assert_eq!(false, builder.is_empty());
141  /// ```
142  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}