use crate::{
error::{Error, Result},
types::web_search::{WebSearchRequest, WebSearchResponse},
utils::retry::operations::WEB_SEARCH,
utils::{
retry::execute_with_retry_builder, retry::handle_response_json,
validation::validate_web_search_request,
},
};
use reqwest::Client;
pub struct WebSearchApi {
pub(crate) client: Client,
pub(crate) config: crate::client::ApiConfig,
}
impl WebSearchApi {
#[must_use = "returns an API client that should be used for API calls"]
pub fn new(client: Client, config: &crate::client::ClientConfig) -> Result<Self> {
Ok(Self {
client,
config: config.to_api_config()?,
})
}
pub async fn search(&self, request: WebSearchRequest) -> Result<WebSearchResponse> {
validate_web_search_request(&request)?;
let url = self
.config
.base_url
.join("web/search")
.map_err(|e| Error::ApiError {
code: 400,
message: format!("Invalid URL for web search: {e}"),
metadata: None,
})?;
let response = execute_with_retry_builder(&self.config.retry_config, WEB_SEARCH, || {
self.client
.post(url.clone())
.headers((*self.config.headers).clone())
.json(&request)
})
.await?;
let search_response: WebSearchResponse =
handle_response_json::<WebSearchResponse>(response, WEB_SEARCH).await?;
Ok(search_response)
}
}