let UndecodableFile {
diffs_with_contents,
diffs_without_contents,
} = file;
let diffs = diffs_with_contents
.iter()
.map(view_diff_with_contents)
.chain(
diffs_without_contents
.iter()
.map(view_diff_without_contents),
);
el(column(diffs))
}
/// View diffs without context (the file contents)
fn view_diff_with_contents(diff: &DiffWithContents) -> Element<'_, Action> {
match diff {
DiffWithContents::Add => el(text("Added")),
DiffWithContents::Edit {
line,
deleted,
contents,
} => {
let line_num = *line;
let lines = contents_to_lines(contents);
let max_line_num = line_num + lines.len();
let line_num_digits = max_line_num.to_string().len();
let lines_view = lines.iter().enumerate().map(|(ix, line)| {
el(row([
el(code_view(if *deleted { "- " } else { "+ " })),
el(line_num_view(line_num + ix, line_num_digits)),
el(code_view(line.clone()).width(Length::Fill)),
]))
});
el(column(lines_view))
}
DiffWithContents::Replacement {
line,
change_contents,
replacement_contents,
} => {
let line_num = *line;
let change_lines = contents_to_lines(change_contents);
let replacement_lines = contents_to_lines(replacement_contents);
let max_line_num = line_num
+ cmp::max(change_lines.len(), replacement_lines.len());
let line_num_digits = max_line_num.to_string().len();
// TODO: re-use with `view_decoded`
let lines_view = change_lines
.iter()
.enumerate()
.map(|(ix, line)| {
el(container(row([
el(code_view("- ")),
el(line_num_view(line_num + ix, line_num_digits)),
el(code_view(line.clone()).width(Length::Fill)),
]))
.style(|_theme| {
container::background(Background::from(
DELETED_BG_COLOR,
))
}))
})
.chain(replacement_lines.iter().enumerate().map(
|(ix, line)| {
el(container(row([
el(code_view("+ ")),
el(line_num_view(line_num + ix, line_num_digits)),
el(code_view(line.clone()).width(Length::Fill)),
]))
.style(|_theme| {
container::background(Background::from(
ADDED_BG_COLOR,
))
}))
},
));
el(column(lines_view))
}
DiffWithContents::Del => el(text("Deleted")),
DiffWithContents::Undel => el(text("Revived")),
}