use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum SearchProvider {
Bing,
#[default]
#[serde(alias = "duckduckgo")]
DuckDuckGo,
Tavily,
Bocha,
#[serde(alias = "metaso")]
Metaso,
#[serde(alias = "searx", alias = "searx-ng", alias = "searx_ng")]
Searxng,
#[serde(
alias = "baidu-search",
alias = "baidu_ai_search",
alias = "baidu_search",
alias = "baidu-ai-search"
)]
Baidu,
#[serde(
alias = "volcengine",
alias = "ark",
alias = "volc",
alias = "volcengine-ark",
alias = "volcengine_ark",
alias = "volc-ark"
)]
Volcengine,
Sofya,
}
impl SearchProvider {
#[must_use]
pub fn parse(value: &str) -> Option<Self> {
match value.trim().to_ascii_lowercase().as_str() {
"bing" => Some(Self::Bing),
"duckduckgo" | "duck-duck-go" | "duck_duck_go" | "ddg" => Some(Self::DuckDuckGo),
"tavily" => Some(Self::Tavily),
"bocha" => Some(Self::Bocha),
"metaso" => Some(Self::Metaso),
"searxng" | "searx" | "searx-ng" | "searx_ng" => Some(Self::Searxng),
"baidu" | "baidu-search" | "baidu_search" | "baidu-ai-search" | "baidu_ai_search" => {
Some(Self::Baidu)
}
"volcengine" | "ark" | "volc" | "volcengine-ark" => Some(Self::Volcengine),
"sofya" => Some(Self::Sofya),
_ => None,
}
}
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
Self::Bing => "bing",
Self::DuckDuckGo => "duckduckgo",
Self::Tavily => "tavily",
Self::Bocha => "bocha",
Self::Metaso => "metaso",
Self::Searxng => "searxng",
Self::Baidu => "baidu",
Self::Volcengine => "volcengine",
Self::Sofya => "sofya",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SearchProviderSource {
Default,
Config,
EnvOverride,
}
impl SearchProviderSource {
#[must_use]
pub fn as_str(self) -> &'static str {
match self {
Self::Default => "default",
Self::Config => "config",
Self::EnvOverride => "env override",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SearchProviderResolution {
pub provider: SearchProvider,
pub source: SearchProviderSource,
}
#[derive(Debug, Clone, Deserialize, Default)]
pub struct SearchConfig {
#[serde(default)]
pub provider: Option<SearchProvider>,
#[serde(default)]
pub base_url: Option<String>,
#[serde(default)]
pub api_key: Option<String>,
}