Mercurial > hg
changeset 42610:5672bb73f61e
rust-utils: add docstrings and doctests for utils.rs
Differential Revision: https://phab.mercurial-scm.org/D6635
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Wed, 10 Jul 2019 17:41:07 +0200 |
parents | 326fdce22fb2 |
children | 2f760da140ee |
files | rust/hg-core/src/lib.rs rust/hg-core/src/utils.rs |
diffstat | 2 files changed, 45 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/hg-core/src/lib.rs Tue Jul 02 17:15:03 2019 +0200 +++ b/rust/hg-core/src/lib.rs Wed Jul 10 17:41:07 2019 +0200 @@ -15,7 +15,7 @@ DirstateVec, }; mod filepatterns; -mod utils; +pub mod utils; pub use filepatterns::{ build_single_regex, read_pattern_file, PatternSyntax, PatternTuple,
--- 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() + } }