Skip to main content

libutils_diff/
mod.rs

1//^
2//^ HEAD
3//^
4
5//> HEAD -> NO_STD
6#![no_std]
7
8//> HEAD -> FEATURES
9#![feature(test)]
10
11//> HEAD -> CRATES
12extern crate alloc;
13extern crate test;
14
15//> HEAD -> MODULES
16#[cfg(test)]
17mod benches;
18#[cfg(test)]
19mod tests;
20
21//> HEAD -> ALLOC
22use alloc::vec::Vec;
23
24
25//^ 
26//^ DIFF
27//^ 
28
29//> DIFF -> STRUCT
30#[derive(Debug, Clone, Copy)]
31pub struct Diff<'valid> {
32    remove: usize,
33    write: &'valid [u8]
34}
35
36//> DIFF -> ERASE
37const ERASE: [u8; 7] = [b'\x1B', b'[', b'D', b' ', b'\x1B', b'[', b'D'];
38
39//> DIFF -> IMPLEMENTATION
40impl<'valid> Diff<'valid> {
41    pub fn new(current: &[u8], replacement: &'valid [u8]) -> Self {
42        let mut old = current.into_iter();
43        let mut new = replacement.into_iter();
44        for index in 0.. {return if old.next() != new.next() {Diff {
45            remove: current.len() - index,
46            write: &replacement[index..]
47        }} else {continue}}
48        unreachable!();
49    }
50}
51
52//> DIFF -> INTO VEC U8
53impl<'valid> Into<Vec<u8>> for Diff<'valid> {
54    fn into(self) -> Vec<u8> {
55        let mut sequence = Vec::new();
56        sequence.extend(ERASE.repeat(self.remove));
57        sequence.extend(self.write);
58        return sequence;
59    }
60}