| extern crate term; |
| extern crate difference; |
| use difference::{Difference, Changeset}; |
| use std::io::Write; |
| |
| /* |
| * The only thing to do here is to create a diff based on line |
| * splits (passing the newline character as a split symbol) |
| * and iterate over the results, matching and formatting them based |
| * on the type of `Difference`. |
| * |
| * Screenshot: |
| * https://raw.githubusercontent.com/johannhof/difference.rs/master/assets/git-style.png |
| */ |
| |
| #[allow(unused_must_use)] |
| #[cfg_attr(feature = "cargo-clippy", allow(needless_range_loop))] |
| 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)."; |
| |
| // Compare both texts, the third parameter defines the split level. |
| 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) => { |
| t.fg(term::color::GREEN).unwrap(); |
| writeln!(t, "+{}", x); |
| } |
| Difference::Rem(ref x) => { |
| t.fg(term::color::RED).unwrap(); |
| writeln!(t, "-{}", x); |
| } |
| } |
| } |
| t.reset().unwrap(); |
| t.flush().unwrap(); |
| } |