Colored output, closes #8

This commit is contained in:
sharkdp 2017-05-12 13:02:20 +02:00
parent b1baa5cb76
commit fba5e02c25
3 changed files with 27 additions and 7 deletions

7
Cargo.lock generated
View File

@ -2,6 +2,7 @@
name = "fd"
version = "0.1.0"
dependencies = [
"ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)",
"regex 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"walkdir 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
@ -15,6 +16,11 @@ dependencies = [
"memchr 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "ansi_term"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "getopts"
version = "0.2.14"
@ -126,6 +132,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[metadata]
"checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699"
"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"
"checksum getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9047cfbd08a437050b363d35ef160452c5fe8ea5187ae0a624708c91581d685"
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
"checksum libc 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)" = "babb8281da88cba992fa1f4ddec7d63ed96280a1a53ec9b919fd37b53d71e502"

View File

@ -7,3 +7,4 @@ authors = ["David Peter <mail@david-peter.de>"]
getopts = "0.2"
regex = "0.2"
walkdir = "1"
ansi_term = "0.9"

View File

@ -1,6 +1,7 @@
extern crate walkdir;
extern crate regex;
extern crate getopts;
extern crate ansi_term;
use std::env;
use std::path::Path;
@ -11,6 +12,17 @@ use std::error::Error;
use walkdir::{WalkDir, DirEntry, WalkDirIterator};
use regex::{Regex, RegexBuilder};
use getopts::Options;
use ansi_term::Colour;
/// Print a search result to the console.
fn print_entry(entry: &DirEntry, path_str: &str) {
let style = match entry {
e if e.path_is_symbolic_link() => Colour::Purple,
e if e.path().is_dir() => Colour::Cyan,
_ => Colour::White
};
println!("{}", style.paint(path_str));
}
/// Check if filename of entry starts with a dot.
fn is_hidden(entry: &DirEntry) -> bool {
@ -30,19 +42,19 @@ fn scan(root: &Path, pattern: &Regex) {
continue;
}
let path_str_r = entry
.path()
.strip_prefix(root) // create relative path
.ok()
.and_then(Path::to_str);
let path_relative =
match entry.path().strip_prefix(root) {
Ok(r) => r,
Err(_) => continue
};
let path_str = match path_str_r {
let path_str = match path_relative.to_str() {
Some(p) => p,
None => continue
};
pattern.find(path_str)
.map(|_| println!("{}", path_str));
.map(|_| print_entry(&entry, path_str));
}
}