Compares the bytes within a certain data range.
(left_data: &[u8], right_data: &[u8])
| 78 | |
| 79 | /// Compares the bytes within a certain data range. |
| 80 | fn diff_data_range(left_data: &[u8], right_data: &[u8]) -> (f32, Vec<DataDiff>, Vec<DataDiff>) { |
| 81 | let ops = capture_diff_slices(Algorithm::Patience, left_data, right_data); |
| 82 | let bytes_match_ratio = get_diff_ratio(&ops, left_data.len(), right_data.len()); |
| 83 | |
| 84 | let mut left_data_diff = Vec::<DataDiff>::new(); |
| 85 | let mut right_data_diff = Vec::<DataDiff>::new(); |
| 86 | for op in ops { |
| 87 | let (tag, left_range, right_range) = op.as_tag_tuple(); |
| 88 | let left_len = left_range.len(); |
| 89 | let right_len = right_range.len(); |
| 90 | let mut len = left_len.max(right_len); |
| 91 | let kind = match tag { |
| 92 | similar::DiffTag::Equal => DataDiffKind::None, |
| 93 | similar::DiffTag::Delete => DataDiffKind::Delete, |
| 94 | similar::DiffTag::Insert => DataDiffKind::Insert, |
| 95 | similar::DiffTag::Replace => { |
| 96 | // Ensure replacements are equal length |
| 97 | len = left_len.min(right_len); |
| 98 | DataDiffKind::Replace |
| 99 | } |
| 100 | }; |
| 101 | let left_data = &left_data[left_range]; |
| 102 | let right_data = &right_data[right_range]; |
| 103 | left_data_diff.push(DataDiff { |
| 104 | data: left_data[..len.min(left_data.len())].to_vec(), |
| 105 | kind, |
| 106 | size: len, |
| 107 | }); |
| 108 | right_data_diff.push(DataDiff { |
| 109 | data: right_data[..len.min(right_data.len())].to_vec(), |
| 110 | kind, |
| 111 | size: len, |
| 112 | }); |
| 113 | if kind == DataDiffKind::Replace { |
| 114 | match left_len.cmp(&right_len) { |
| 115 | Ordering::Less => { |
| 116 | let len = right_len - left_len; |
| 117 | left_data_diff.push(DataDiff { |
| 118 | data: vec![], |
| 119 | kind: DataDiffKind::Insert, |
| 120 | size: len, |
| 121 | }); |
| 122 | right_data_diff.push(DataDiff { |
| 123 | data: right_data[left_len..right_len].to_vec(), |
| 124 | kind: DataDiffKind::Insert, |
| 125 | size: len, |
| 126 | }); |
| 127 | } |
| 128 | Ordering::Greater => { |
| 129 | let len = left_len - right_len; |
| 130 | left_data_diff.push(DataDiff { |
| 131 | data: left_data[right_len..left_len].to_vec(), |
| 132 | kind: DataDiffKind::Delete, |
| 133 | size: len, |
| 134 | }); |
| 135 | right_data_diff.push(DataDiff { |
| 136 | data: vec![], |
| 137 | kind: DataDiffKind::Delete, |
no test coverage detected