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}