use std::collections::HashSet;
use std::process;
use std::time;
use std::io::Write;
use exec::CommandTemplate;
use lscolors::LsColors;
use walk::FileType;
use regex_syntax::{Expr, ExprBuilder};
pub struct FdOptions {
pub case_sensitive: bool,
pub search_full_path: bool,
pub ignore_hidden: bool,
pub read_ignore: bool,
pub read_gitignore: bool,
pub follow_links: bool,
pub null_separator: bool,
pub max_depth: Option<usize>,
pub threads: usize,
pub max_buffer_time: Option<time::Duration>,
pub ls_colors: Option<LsColors>,
pub file_types: HashSet<FileType>,
pub extensions: Option<HashSet<String>>,
pub command: Option<CommandTemplate>,
pub exclude_patterns: Vec<String>,
}
pub fn error(message: &str) -> ! {
writeln!(&mut ::std::io::stderr(), "{}", message).expect("Failed writing to stderr");
process::exit(1);
}
pub fn pattern_has_uppercase_char(pattern: &str) -> bool {
ExprBuilder::new()
.parse(pattern)
.map(|expr| expr_has_uppercase_char(&expr))
.unwrap_or(false)
}
fn expr_has_uppercase_char(expr: &Expr) -> bool {
match *expr {
Expr::Literal { ref chars, .. } => chars.iter().any(|c| c.is_uppercase()),
Expr::Class(ref ranges) => ranges
.iter()
.any(|r| r.start.is_uppercase() || r.end.is_uppercase()),
Expr::Group { ref e, .. } | Expr::Repeat { ref e, .. } => expr_has_uppercase_char(e),
Expr::Concat(ref es) => es.iter().any(expr_has_uppercase_char),
Expr::Alternate(ref es) => es.iter().any(expr_has_uppercase_char),
_ => false,
}
}
pub const MAX_BUFFER_LENGTH: usize = 1000;
pub const EXITCODE_ERROR: i32 = 1;
pub const EXITCODE_SIGINT: i32 = 130;