Skip to main content

libutils_diff/
mod.rs

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