use serde::{Deserialize, Serialize};
use tracing::{error, info, warn};
use crate::free_launch::config::Config;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchProvider {
pub name: String,
pub aliases: Vec<String>,
pub url: String,
pub browser: Option<String>,
}
impl SearchProvider {
pub fn matches_alias(&self, query: &str) -> bool {
self.aliases.iter().any(|alias| query.starts_with(alias))
}
pub fn get_matching_alias(&self, query: &str) -> Option<&str> {
let first_word = query.split_whitespace().next()?;
let mut best_match = "";
for alias in &self.aliases {
if first_word == alias && alias.len() > best_match.len() {
best_match = alias;
}
}
if best_match.is_empty() {
None
} else {
Some(best_match)
}
}
}
pub(crate) fn load_search_providers() -> Vec<SearchProvider> {
info!("Loading search providers from config...");
let search_providers = match Config::load() {
Ok(Some(config)) => config.providers,
Ok(None) => {
warn!("No search config found at ~/.config/search/config.yaml");
Vec::new()
}
Err(e) => {
error!("Failed to load search config: {}", e);
Vec::new()
}
};
search_providers
}