#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RequestedMode {
Auto,
Exact,
Semantic,
Deep,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum QueryRoute {
ExactSymbol,
ExactText,
Semantic,
DeepPdg,
}
pub fn classify(query: &str, requested: RequestedMode) -> QueryRoute {
match requested {
RequestedMode::Exact => return QueryRoute::ExactText,
RequestedMode::Semantic => return QueryRoute::Semantic,
RequestedMode::Deep => return QueryRoute::DeepPdg,
RequestedMode::Auto => {}
}
let query = query.trim_matches(|c| matches!(c, '`' | '"' | '\''));
let identifier = !query.is_empty()
&& !query.chars().any(char::is_whitespace)
&& query
.chars()
.all(|c| c.is_ascii_alphanumeric() || matches!(c, '_' | ':' | '.'));
if identifier {
QueryRoute::ExactSymbol
} else {
QueryRoute::Semantic
}
}
#[cfg(test)]
mod tests {
use super::{QueryRoute, RequestedMode, classify};
#[test]
fn routes_identifier_and_natural_language_queries() {
assert_eq!(
classify("`Askpass::new`", RequestedMode::Auto),
QueryRoute::ExactSymbol
);
assert_eq!(
classify("registry_record", RequestedMode::Exact),
QueryRoute::ExactText
);
assert_eq!(
classify("how are sudo credentials propagated", RequestedMode::Auto),
QueryRoute::Semantic
);
assert_eq!(
classify("sudo credential flow", RequestedMode::Deep),
QueryRoute::DeepPdg
);
}
}