summaryrefslogtreecommitdiffstats
path: root/vendor/similar/examples/terminal-inline.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/similar/examples/terminal-inline.rs')
-rw-r--r--vendor/similar/examples/terminal-inline.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/vendor/similar/examples/terminal-inline.rs b/vendor/similar/examples/terminal-inline.rs
new file mode 100644
index 0000000..4c5d74f
--- /dev/null
+++ b/vendor/similar/examples/terminal-inline.rs
@@ -0,0 +1,60 @@
+use std::fmt;
+use std::fs::read;
+use std::process::exit;
+
+use console::{style, Style};
+use similar::{ChangeTag, TextDiff};
+
+struct Line(Option<usize>);
+
+impl fmt::Display for Line {
+ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
+ match self.0 {
+ None => write!(f, " "),
+ Some(idx) => write!(f, "{:<4}", idx + 1),
+ }
+ }
+}
+
+fn main() {
+ let args: Vec<_> = std::env::args_os().collect();
+ if args.len() != 3 {
+ eprintln!("usage: terminal-inline [old] [new]");
+ exit(1);
+ }
+
+ let old = read(&args[1]).unwrap();
+ let new = read(&args[2]).unwrap();
+ let diff = TextDiff::from_lines(&old, &new);
+
+ for (idx, group) in diff.grouped_ops(3).iter().enumerate() {
+ if idx > 0 {
+ println!("{:-^1$}", "-", 80);
+ }
+ for op in group {
+ for change in diff.iter_inline_changes(op) {
+ let (sign, s) = match change.tag() {
+ ChangeTag::Delete => ("-", Style::new().red()),
+ ChangeTag::Insert => ("+", Style::new().green()),
+ ChangeTag::Equal => (" ", Style::new().dim()),
+ };
+ print!(
+ "{}{} |{}",
+ style(Line(change.old_index())).dim(),
+ style(Line(change.new_index())).dim(),
+ s.apply_to(sign).bold(),
+ );
+ for (emphasized, value) in change.iter_strings_lossy() {
+ if emphasized {
+ print!("{}", s.apply_to(value).underlined().on_black());
+ } else {
+ print!("{}", s.apply_to(value));
+ }
+ }
+ if change.missing_newline() {
+ println!();
+ }
+ }
+ }
+ }
+}