difference_rs/
multi.rs

1use std::char::REPLACEMENT_CHARACTER;
2
3use crate::{Changeset, ChangesetMulti, Difference};
4
5impl From<(Changeset, Vec<(usize, String)>, Vec<(usize, String)>)> for ChangesetMulti {
6    fn from(
7        (changeset, orig_splits, edit_splits): (
8            Changeset,
9            Vec<(usize, String)>,
10            Vec<(usize, String)>,
11        ),
12    ) -> Self {
13        let distance = changeset.distance;
14        let mut orig_counter = 0;
15        let mut edit_counter = 0;
16        let diffs = changeset
17            .diffs
18            .into_iter()
19            .map(|d| match d {
20                Difference::Same(ref x) => {
21                    let orig = x.as_str().split(REPLACEMENT_CHARACTER).collect::<Vec<_>>();
22                    let mut s = String::new();
23                    for word in orig {
24                        orig_counter += word.len();
25                        edit_counter += word.len();
26                        s.push_str(word);
27                        if let Some(split) = orig_splits
28                            .iter()
29                            .find(|(idx, _split)| idx == &orig_counter)
30                        {
31                            orig_counter += split.1.len();
32                            edit_counter += split.1.len();
33
34                            s.push_str(&split.1);
35                        }
36                    }
37                    Difference::Same(s)
38                }
39                Difference::Add(ref x) => {
40                    let edit = x.as_str().split(REPLACEMENT_CHARACTER).collect::<Vec<_>>();
41                    let mut s = String::new();
42                    for word in edit {
43                        edit_counter += word.len();
44                        s.push_str(word);
45                        if let Some(split) = edit_splits
46                            .iter()
47                            .find(|(idx, _split)| idx == &edit_counter)
48                        {
49                            edit_counter += split.1.len();
50                            s.push_str(&split.1);
51                        }
52                    }
53                    Difference::Add(s)
54                }
55                Difference::Rem(ref x) => {
56                    let orig = x.as_str().split(REPLACEMENT_CHARACTER).collect::<Vec<_>>();
57                    let mut s = String::new();
58                    for word in orig {
59                        orig_counter += word.len();
60                        s.push_str(word);
61                        if let Some(split) = orig_splits
62                            .iter()
63                            .find(|(idx, _split)| idx == &orig_counter)
64                        {
65                            orig_counter += split.1.len();
66                            s.push_str(&split.1);
67                        }
68                    }
69                    Difference::Rem(s)
70                }
71            })
72            .collect();
73        ChangesetMulti {
74            splits: orig_splits,
75            edit_splits,
76            distance,
77            diffs,
78        }
79    }
80}