use self::Filter::*;
use regex::Regex;
use std::path::Path;
pub enum FilterListType {
Blacklist,
Whitelist,
}
pub enum Filter {
Include(FilterRule),
Exclude(FilterRule),
}
impl Filter {
pub fn include_extension<S: Into<String>>(ext: S) -> Self {
Include(FilterRule::extension(ext))
}
pub fn exclude_extension<S: Into<String>>(ext: S) -> Self {
Exclude(FilterRule::extension(ext))
}
pub fn include_regex<S: AsRef<str>>(regex_str: S) -> Self {
Include(FilterRule::regex(regex_str))
}
pub fn exclude_regex<S: AsRef<str>>(regex_str: S) -> Self {
Exclude(FilterRule::regex(regex_str))
}
pub fn matches<P: AsRef<Path>>(&self, relative_path: P) -> bool {
match self {
Include(rule) => rule.matches(relative_path),
Exclude(rule) => rule.matches(relative_path),
}
}
}
pub enum FilterRule {
Extension(String),
Regex(Regex),
}
impl FilterRule {
pub fn extension<S: Into<String>>(extension: S) -> Self {
let ext = extension.into();
if &ext[0..1] == "." {
panic!("Filter::Extension should not contain a period prefix!");
}
FilterRule::Extension(ext)
}
pub fn regex<S: AsRef<str>>(regex_str: S) -> Self {
let regex = Regex::new(regex_str.as_ref());
FilterRule::Regex(regex.unwrap())
}
pub fn matches<P: AsRef<Path>>(&self, relative_path: P) -> bool {
let path = relative_path.as_ref();
match self {
FilterRule::Extension(ext) => path.extension() == Some(ext.as_ref()),
FilterRule::Regex(re) => re.is_match(
path.to_str()
.expect("Path couldn't be represented by a str"),
),
}
}
}
pub(crate) fn path_to_string<P: AsRef<Path>>(path: P) -> String {
path.as_ref()
.to_str()
.expect("Unable to represent path as str")
.to_string()
}
pub fn watch_path<P: AsRef<Path>>(p: P) {
println!("cargo:rerun-if-changed={}", p.as_ref().to_str().unwrap());
}