D7870: rust-utils: add `Escaped` trait
Alphare (Raphaël Gomès)
phabricator at mercurial-scm.org
Thu Feb 6 16:47:56 UTC 2020
Alphare updated this revision to Diff 19958.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D7870?vs=19348&id=19958
BRANCH
default
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D7870/new/
REVISION DETAIL
https://phab.mercurial-scm.org/D7870
AFFECTED FILES
rust/hg-core/src/utils.rs
CHANGE DETAILS
diff --git a/rust/hg-core/src/utils.rs b/rust/hg-core/src/utils.rs
--- a/rust/hg-core/src/utils.rs
+++ b/rust/hg-core/src/utils.rs
@@ -7,6 +7,9 @@
//! Contains useful functions, traits, structs, etc. for use in core.
+use crate::utils::hg_path::HgPath;
+use std::{io::Write, ops::Deref};
+
pub mod files;
pub mod hg_path;
pub mod path_auditor;
@@ -112,3 +115,54 @@
}
}
}
+
+pub trait Escaped {
+ /// Return bytes escaped for display to the user
+ fn escaped_bytes(&self) -> Vec<u8>;
+}
+
+impl Escaped for u8 {
+ fn escaped_bytes(&self) -> Vec<u8> {
+ let mut acc = vec![];
+ match self {
+ c @ b'\'' | c @ b'\\' => {
+ acc.push(b'\\');
+ acc.push(*c);
+ }
+ b'\t' => {
+ acc.extend(br"\\t");
+ }
+ b'\n' => {
+ acc.extend(br"\\n");
+ }
+ b'\r' => {
+ acc.extend(br"\\r");
+ }
+ c if (*c < b' ' || *c >= 127) => {
+ write!(acc, "\\x{:x}", self).unwrap();
+ }
+ c => {
+ acc.push(*c);
+ }
+ }
+ acc
+ }
+}
+
+impl<'a, T: Escaped> Escaped for &'a [T] {
+ fn escaped_bytes(&self) -> Vec<u8> {
+ self.iter().flat_map(|item| item.escaped_bytes()).collect()
+ }
+}
+
+impl<T: Escaped> Escaped for Vec<T> {
+ fn escaped_bytes(&self) -> Vec<u8> {
+ self.deref().escaped_bytes()
+ }
+}
+
+impl<'a> Escaped for &'a HgPath {
+ fn escaped_bytes(&self) -> Vec<u8> {
+ self.as_bytes().escaped_bytes()
+ }
+}
To: Alphare, #hg-reviewers, kevincox, martinvonz
Cc: martinvonz, durin42, kevincox, mercurial-devel
More information about the Mercurial-devel
mailing list