rust/hg-core/src/utils.rs
changeset 42610 5672bb73f61e
parent 42609 326fdce22fb2
child 42611 2f760da140ee
--- a/rust/hg-core/src/utils.rs	Tue Jul 02 17:15:03 2019 +0200
+++ b/rust/hg-core/src/utils.rs	Wed Jul 10 17:41:07 2019 +0200
@@ -1,10 +1,25 @@
 pub mod files;
 
+/// Replaces the `from` slice with the `to` slice inside the `buf` slice.
+///
+/// # Examples
+///
+/// ```
+/// use crate::hg::utils::replace_slice;
+/// let mut line = b"I hate writing tests!".to_vec();
+/// replace_slice(&mut line, b"hate", b"love");
+/// assert_eq!(
+///     line,
+///     b"I love writing tests!".to_vec()
+///);
+///
+/// ```
 pub fn replace_slice<T>(buf: &mut [T], from: &[T], to: &[T])
 where
     T: Clone + PartialEq,
 {
-    if buf.len() < from.len() || from.len() != to.len() {
+    assert_eq!(from.len(), to.len());
+    if buf.len() < from.len() {
         return;
     }
     for i in 0..=buf.len() - from.len() {
@@ -15,8 +30,9 @@
 }
 
 pub trait SliceExt {
+    fn trim_end(&self) -> &Self;
+    fn trim_start(&self) -> &Self;
     fn trim(&self) -> &Self;
-    fn trim_end(&self) -> &Self;
 }
 
 fn is_not_whitespace(c: &u8) -> bool {
@@ -24,17 +40,6 @@
 }
 
 impl SliceExt for [u8] {
-    fn trim(&self) -> &[u8] {
-        if let Some(first) = self.iter().position(is_not_whitespace) {
-            if let Some(last) = self.iter().rposition(is_not_whitespace) {
-                &self[first..last + 1]
-            } else {
-                unreachable!();
-            }
-        } else {
-            &[]
-        }
-    }
     fn trim_end(&self) -> &[u8] {
         if let Some(last) = self.iter().rposition(is_not_whitespace) {
             &self[..last + 1]
@@ -42,4 +47,30 @@
             &[]
         }
     }
+    fn trim_start(&self) -> &[u8] {
+        if let Some(first) = self.iter().position(is_not_whitespace) {
+            &self[first..]
+        } else {
+            &[]
+        }
+    }
+
+    /// ```
+    /// use hg::utils::SliceExt;
+    /// assert_eq!(
+    ///     b"  to trim  ".trim(),
+    ///     b"to trim"
+    /// );
+    /// assert_eq!(
+    ///     b"to trim  ".trim(),
+    ///     b"to trim"
+    /// );
+    /// assert_eq!(
+    ///     b"  to trim".trim(),
+    ///     b"to trim"
+    /// );
+    /// ```
+    fn trim(&self) -> &[u8] {
+        self.trim_start().trim_end()
+    }
 }