my fork of dmp
Diffstat (limited to 'src/traits.rs')
| -rw-r--r-- | src/traits.rs | 93 |
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 |