my fork of dmp
Diffstat (limited to 'src/traits.rs')
-rw-r--r--src/traits.rs93
1 files changed, 91 insertions, 2 deletions
diff --git a/src/traits.rs b/src/traits.rs
index 20e0025..73635f8 100644
--- a/src/traits.rs
+++ b/src/traits.rs
@@ -1,11 +1,28 @@
use std::hash::Hash;
use chrono::NaiveTime;
+use percent_encoding::{AsciiSet, CONTROLS};
use crate::dmp::{Diff, DiffMatchPatch};
+// Appending controls to ensure exact same encoding as cpp variant
+const ENCODE_SET: &AsciiSet = &CONTROLS
+ .add(b'"')
+ .add(b'<')
+ .add(b'>')
+ .add(b'`')
+ .add(b'{')
+ .add(b'}')
+ .add(b'%')
+ .add(b'[')
+ .add(b'\\')
+ .add(b']')
+ .add(b'^')
+ .add(b'|');
+
pub trait DType: Copy + Ord + Eq + Hash {
+ fn differ(dmp: &DiffMatchPatch, txt_old: &str, txt_new: &str) -> Result<Vec<Diff<Self>>, crate::errors::Error>;
fn bisect_split(
dmp: &DiffMatchPatch,
old: &[Self],
@@ -16,16 +33,22 @@ pub trait DType: Copy + Ord + Eq + Hash {
) -> Result<Vec<Diff<Self>>, crate::errors::Error>;
fn from_char(c: char) -> Self;
-
fn as_char(&self) -> Option<char>;
-
fn from_str(str: &str) -> Vec<Self>;
+ fn to_string(data: &[Self]) -> Result<String, crate::Error>;
fn is_linebreak_end(input: &[Self]) -> bool;
fn is_linebreak_start(input: &[Self]) -> bool;
+
+ fn percent_encode(input: &[Self]) -> Vec<Self>;
+ fn percent_decode(input: &[Self]) -> Vec<Self>;
}
impl DType for u8 {
+ fn differ(dmp: &DiffMatchPatch, txt_old: &str, txt_new: &str) -> Result<Vec<Diff<Self>>, crate::errors::Error> {
+ dmp.diff_main(txt_old, txt_new)
+ }
+
fn bisect_split(
dmp: &DiffMatchPatch,
old: &[u8],
@@ -60,6 +83,11 @@ impl DType for u8 {
}
#[inline]
+ fn to_string(data: &[Self]) -> Result<String, crate::Error> {
+ std::str::from_utf8(data).map_err(|_| crate::Error::Utf8Error).map(|s| s.to_string())
+ }
+
+ #[inline]
fn is_linebreak_end(input: &[Self]) -> bool {
input.ends_with(b"\n\n") || input.ends_with(b"\n\r\n")
}
@@ -71,9 +99,24 @@ impl DType for u8 {
|| input.starts_with(b"\n\r\n")
|| input.starts_with(b"\n\n")
}
+
+ #[inline]
+ fn percent_encode(input: &[Self]) -> Vec<Self> {
+ percent_encoding::percent_encode(input, ENCODE_SET).collect::<String>().as_bytes().to_vec()
+ }
+
+ #[inline]
+ fn percent_decode(input: &[Self]) -> Vec<Self> {
+ // percent_encoding::percent_encode(input, ENCODE_SET).collect::<String>().as_bytes().to_vec()
+ todo!()
+ }
}
impl DType for char {
+ fn differ(dmp: &DiffMatchPatch, txt_old: &str, txt_new: &str) -> Result<Vec<Diff<Self>>, crate::errors::Error> {
+ dmp.diff_main_compat(txt_old, txt_new)
+ }
+
fn bisect_split(
dmp: &DiffMatchPatch,
old: &[char],
@@ -108,6 +151,11 @@ impl DType for char {
}
#[inline]
+ fn to_string(data: &[Self]) -> Result<String, crate::Error> {
+ Ok(data.iter().collect::<String>())
+ }
+
+ #[inline]
fn is_linebreak_end(input: &[Self]) -> bool {
input.ends_with(&['\n', '\n']) || input.ends_with(&['\n', '\r', '\n'])
}
@@ -119,9 +167,36 @@ impl DType for char {
|| input.starts_with(&['\n', '\r', '\n'])
|| input.starts_with(&['\n', '\n'])
}
+
+ #[inline]
+ fn percent_encode(input: &[Self]) -> Vec<Self> {
+ let d = input
+ .iter()
+ .map(|c| {
+ let mut b = vec![0; c.len_utf8()];
+ c.encode_utf8(&mut b);
+
+ b
+ }).collect::<Vec<_>>()
+ .concat();
+
+
+ let encoded = percent_encoding::percent_encode(&d[..], ENCODE_SET).collect::<String>();
+
+ Self::from_str(&encoded)
+ }
+
+ #[inline]
+ fn percent_decode(input: &[Self]) -> Vec<Self> {
+ todo!()
+ }
}
impl DType for usize {
+ fn differ(_: &DiffMatchPatch, _: &str, _: &str) -> Result<Vec<Diff<Self>>, crate::errors::Error> {
+ unimplemented!()
+ }
+
fn bisect_split(
dmp: &DiffMatchPatch,
old: &[usize],
@@ -155,6 +230,10 @@ impl DType for usize {
unimplemented!()
}
+ fn to_string(_: &[Self]) -> Result<String, crate::Error> {
+ unimplemented!()
+ }
+
fn is_linebreak_end(_: &[Self]) -> bool {
unimplemented!()
}
@@ -163,4 +242,14 @@ impl DType for usize {
fn is_linebreak_start(_: &[Self]) -> bool {
unimplemented!()
}
+
+ #[inline]
+ fn percent_encode(_: &[Self]) -> Vec<Self> {
+ unimplemented!()
+ }
+
+ #[inline]
+ fn percent_decode(_: &[Self]) -> Vec<Self> {
+ unimplemented!()
+ }
} \ No newline at end of file