web_search/providers/
base.rs1use async_trait::async_trait;
4use serde::{Deserialize, Serialize};
5
6use crate::error::SearchError;
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct SearchResult {
11 pub title: String,
13 pub url: String,
15 pub snippet: String,
17 pub source: String,
19 pub rank: usize,
21 #[serde(skip_serializing_if = "Option::is_none")]
23 pub score: Option<f64>,
24 #[serde(skip_serializing_if = "Option::is_none")]
26 pub sources: Option<Vec<String>>,
27}
28
29#[derive(Debug, Clone, Default)]
31pub struct SearchOptions {
32 pub limit: Option<usize>,
34 pub language: Option<String>,
36 pub region: Option<String>,
38 pub safe_search: Option<bool>,
40}
41
42#[async_trait]
44pub trait SearchProvider: Send + Sync {
45 fn name(&self) -> &str;
47
48 fn is_available(&self) -> bool;
50
51 fn weight(&self) -> f64;
53
54 fn set_weight(&mut self, weight: f64);
56
57 fn set_enabled(&mut self, enabled: bool);
59
60 async fn search(
62 &self,
63 query: &str,
64 options: &SearchOptions,
65 ) -> Result<Vec<SearchResult>, SearchError>;
66}