use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use crate::error::SearchError;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchResult {
pub title: String,
pub url: String,
pub snippet: String,
pub source: String,
pub rank: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub score: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sources: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default)]
pub struct SearchOptions {
pub limit: Option<usize>,
pub language: Option<String>,
pub region: Option<String>,
pub safe_search: Option<bool>,
}
#[async_trait]
pub trait SearchProvider: Send + Sync {
fn name(&self) -> &str;
fn is_available(&self) -> bool;
fn weight(&self) -> f64;
fn set_weight(&mut self, weight: f64);
fn set_enabled(&mut self, enabled: bool);
async fn search(
&self,
query: &str,
options: &SearchOptions,
) -> Result<Vec<SearchResult>, SearchError>;
}