extern crate term; extern crate difference; use difference::{Difference, Changeset}; use std::io::Write; // Screenshot: // https://raw.githubusercontent.com/johannhof/difference.rs/master/assets/github-style.png #[allow(unused_must_use)] fn main() { let text1 = "Roses are red, violets are blue,\n\ I wrote this library here,\n\ just for you.\n\ (It's true)."; let text2 = "Roses are red, violets are blue,\n\ I wrote this documentation here,\n\ just for you.\n\ (It's quite true)."; let Changeset { diffs, .. } = Changeset::new(text1, text2, "\n"); let mut t = term::stdout().unwrap(); for i in 0..diffs.len() { match diffs[i] { Difference::Same(ref x) => { t.reset().unwrap(); writeln!(t, " {}", x); } Difference::Add(ref x) => { match diffs[i - 1] { Difference::Rem(ref y) => { t.fg(term::color::GREEN).unwrap(); write!(t, "+"); let Changeset { diffs, .. } = Changeset::new(y, x, " "); for c in diffs { match c { Difference::Same(ref z) => { t.fg(term::color::GREEN).unwrap(); write!(t, "{}", z); write!(t, " "); } Difference::Add(ref z) => { t.fg(term::color::WHITE).unwrap(); t.bg(term::color::GREEN).unwrap(); write!(t, "{}", z); t.reset().unwrap(); write!(t, " "); } _ => (), } } writeln!(t, ""); } _ => { t.fg(term::color::BRIGHT_GREEN).unwrap(); writeln!(t, "+{}", x); } }; } Difference::Rem(ref x) => { t.fg(term::color::RED).unwrap(); writeln!(t, "-{}", x); } } } t.reset().unwrap(); t.flush().unwrap(); }