/
main.rs
85 lines (69 loc) · 1.86 KB
/
main.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
extern crate chrono;
extern crate chrono_english;
extern crate csv;
extern crate humansize;
extern crate imagesize;
#[macro_use]
extern crate lazy_static;
extern crate mp3_metadata;
extern crate regex;
extern crate serde;
#[macro_use]
extern crate serde_derive;
extern crate serde_json;
extern crate term;
extern crate time;
#[cfg(unix)]
extern crate users;
#[cfg(unix)]
extern crate xattr;
extern crate zip;
use std::env;
use term::StdoutTerminal;
mod field;
mod fileinfo;
mod gitignore;
mod lexer;
mod mode;
mod parser;
mod searcher;
mod util;
use parser::Parser;
use searcher::Searcher;
use util::error_message;
fn main() {
let mut t = term::stdout().unwrap();
if env::args().len() == 1 {
usage_info(&mut t);
return;
}
let mut args: Vec<String> = env::args().collect();
args.remove(0);
let first_arg = args[0].to_ascii_lowercase();
if first_arg.contains("help") || first_arg.contains("-h") || first_arg.contains("/?") {
usage_info(&mut t);
return;
}
let query = args.join(" ");
let mut p = Parser::new();
let query = p.parse(&query);
match query {
Ok(query) => {
let mut searcher = Searcher::new(query);
searcher.list_search_results(&mut t).unwrap()
},
Err(err) => error_message("query", &err, &mut t)
}
}
fn usage_info(t: &mut Box<StdoutTerminal>) {
const VERSION: &'static str = env!("CARGO_PKG_VERSION");
print!("FSelect utility");
t.fg(term::color::BRIGHT_YELLOW).unwrap();
println!(" {}", VERSION);
t.reset().unwrap();
println!("Find files with SQL-like queries.");
t.fg(term::color::BRIGHT_CYAN).unwrap();
println!("https://github.com/jhspetersson/fselect");
t.reset().unwrap();
println!("Usage: fselect COLUMN[, COLUMN...] [from ROOT[, ROOT...]] [where EXPR] [order by COLUMNS] [limit N] [into FORMAT]");
}