use crate::glob_detect::has_wildcards;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Constraint<'a> {
Extension(&'a str),
Glob(&'a str),
Parts(&'a [&'a str]),
Text(&'a str),
Exclude(&'a [&'a str]),
PathSegment(&'a str),
FilePath(&'a str),
FileType(&'a str),
GitStatus(GitStatusFilter),
Not(Box<Constraint<'a>>),
}
impl Constraint<'_> {
#[inline(always)]
pub fn is_filename_constraint_token(token: &str) -> bool {
let bytes = token.as_bytes();
if token.is_empty() || (bytes.last() == Some(&b'/') && bytes.first() != Some(&b'.')) {
return false;
}
if has_wildcards(token) {
return false;
}
let filename = token.rsplit('/').next().unwrap_or(token);
match filename.rfind('.') {
None => false,
Some(dot_idx) => {
let extension = &filename[dot_idx + 1..];
!extension.is_empty()
&& extension.len() <= 10 && extension.bytes().all(|b| b.is_ascii_alphanumeric())
}
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GitStatusFilter {
Modified,
Untracked,
Staged,
Unmodified,
}
pub(crate) type TextPartsBuffer<'a> = Vec<&'a str>;