Crate termdiff

Source
Expand description

This library is for helping you create diff for displaying on the terminal

§Examples

use termdiff::{diff, ArrowsTheme};
let old = "The quick brown fox and\njumps over the sleepy dog";
let new = "The quick red fox and\njumps over the lazy dog";
let mut buffer: Vec<u8> = Vec::new();
let theme = ArrowsTheme::default();
diff(&mut buffer, old, new, &theme).unwrap();
let actual: String = String::from_utf8(buffer).expect("Not valid UTF-8");

assert_eq!(
    actual,
    "< left / > right
<The quick brown fox and
<jumps over the sleepy dog
>The quick red fox and
>jumps over the lazy dog
"
);

Alternatively if you are dropping this into a format! or similar, you might want to use the displayable instead

use termdiff::{DrawDiff, SignsTheme};
let old = "The quick brown fox and\njumps over the sleepy dog";
let new = "The quick red fox and\njumps over the lazy dog";
let theme = SignsTheme::default();
let actual = format!("{}", DrawDiff::new(old, new, &theme));

assert_eq!(
    actual,
    "--- remove | insert +++
-The quick brown fox and
-jumps over the sleepy dog
+The quick red fox and
+jumps over the lazy dog
"
);

§Features

This crate provides several features that can be enabled or disabled in your Cargo.toml:

§Diff Algorithms

  • myers - Implements the Myers diff algorithm, which is a widely used algorithm for computing differences between sequences. It’s efficient for most common use cases.

  • similar - Uses the “similar” crate to compute diffs. This is an alternative implementation that may have different performance characteristics or output in some cases.

§Themes

  • arrows - A simple, colorless theme that uses arrow symbols (< and >) to indicate deleted and inserted lines. The header shows “< left / > right”.

  • arrows_color - A colored version of the arrows theme. Uses red for deleted content and green for inserted content. Requires the “crossterm” crate for terminal color support.

  • signs - A simple, colorless theme that uses plus and minus signs (- and +) to indicate deleted and inserted lines. The header shows “— remove | insert +++”. This style is similar to traditional diff output.

  • signs_color - A colored version of the signs theme. Uses red for deleted content and green for inserted content. Requires the “crossterm” crate for terminal color support.

By default, all features are enabled. You can selectively disable features by specifying default-features = false and then listing the features you want to enable.

You can define your own theme if you like

use std::borrow::Cow;

use crossterm::style::Stylize;
use termdiff::{DrawDiff, Theme};

#[derive(Debug)]
struct MyTheme {}
impl Theme for MyTheme {
    fn highlight_insert<'this>(&self, input: &'this str) -> Cow<'this, str> {
        input.into()
    }

    fn highlight_delete<'this>(&self, input: &'this str) -> Cow<'this, str> {
        input.into()
    }

    fn equal_content<'this>(&self, input: &'this str) -> Cow<'this, str> {
        input.into()
    }

    fn delete_content<'this>(&self, input: &'this str) -> Cow<'this, str> {
        input.into()
    }

    fn equal_prefix<'this>(&self) -> Cow<'this, str> {
        "=".into()
    }

    fn delete_prefix<'this>(&self) -> Cow<'this, str> {
        "!".into()
    }

    fn insert_line<'this>(&self, input: &'this str) -> Cow<'this, str> {
        input.into()
    }

    fn insert_prefix<'this>(&self) -> Cow<'this, str> {
        "|".into()
    }

    fn line_end<'this>(&self) -> Cow<'this, str> {
        "\n".into()
    }

    fn header<'this>(&self) -> Cow<'this, str> {
        format!("{}\n", "Header").into()
    }
}
let my_theme = MyTheme {};
let old = "The quick brown fox and\njumps over the sleepy dog";
let new = "The quick red fox and\njumps over the lazy dog";
let actual = format!("{}", DrawDiff::new(old, new, &my_theme));

assert_eq!(
    actual,
    "Header
!The quick brown fox and
!jumps over the sleepy dog
|The quick red fox and
|jumps over the lazy dog
"
);

Structs§

ArrowsColorTheme
A simple colorful theme using arrows
ArrowsTheme
A simple colorless using arrows theme
DrawDiff
The struct that draws the diff
SignsColorTheme
A simple colorful theme using signs
SignsTheme
A simple colorless using signs theme

Enums§

Algorithm
The algorithm to use for computing diffs

Traits§

Theme
A Theme for customizing the appearance of diffs

Functions§

diff
Print a diff to a writer
diff_with_algorithm
Print a diff to a writer using a specific algorithm