use super::{bonus, CharClass, Score};
#[derive(Debug, Default, Clone, Copy, Ord, PartialOrd, Eq, PartialEq)]
pub enum FzfScheme {
#[default]
Default,
Path,
History,
}
impl FzfScheme {
#[inline]
pub(super) fn into_inner(self) -> Scheme {
match self {
Self::Default => DEFAULT,
Self::Path => PATH,
Self::History => HISTORY,
}
}
#[inline]
pub(super) fn from_inner(scheme: &Scheme) -> Option<Self> {
if scheme.bonus_boundary_white == DEFAULT.bonus_boundary_white {
Some(Self::Default)
} else if scheme.bonus_boundary_white == PATH.bonus_boundary_white {
if scheme.initial_char_class == CharClass::Delimiter {
Some(Self::Path)
} else {
Some(Self::History)
}
} else {
None
}
}
}
#[doc(hidden)]
#[derive(Clone)]
pub struct Scheme {
pub bonus_boundary_white: Score,
pub bonus_boundary_delimiter: Score,
pub(super) initial_char_class: CharClass,
pub(super) is_delimiter: fn(char) -> bool,
}
impl Default for Scheme {
#[inline]
fn default() -> Self {
DEFAULT
}
}
pub const DEFAULT: Scheme = Scheme {
bonus_boundary_white: bonus::BOUNDARY + 2,
bonus_boundary_delimiter: bonus::BOUNDARY + 1,
initial_char_class: CharClass::WhiteSpace,
is_delimiter: is_delimiter_default,
};
#[inline]
fn is_delimiter_default(ch: char) -> bool {
matches!(ch, '/' | ',' | ':' | ';' | '|')
}
pub const PATH: Scheme = Scheme {
bonus_boundary_white: bonus::BOUNDARY,
bonus_boundary_delimiter: bonus::BOUNDARY + 1,
initial_char_class: CharClass::Delimiter,
is_delimiter: is_delimiter_path,
};
#[inline]
fn is_delimiter_path(ch: char) -> bool {
#[cfg(windows)]
let os_path_separator = '\\';
#[cfg(not(windows))]
let os_path_separator = '/';
ch == '/' || ch == os_path_separator
}
pub const HISTORY: Scheme = Scheme {
bonus_boundary_white: bonus::BOUNDARY,
bonus_boundary_delimiter: bonus::BOUNDARY,
initial_char_class: DEFAULT.initial_char_class,
is_delimiter: DEFAULT.is_delimiter,
};