asimov_serpapi_module/
api.rs1mod bing;
4pub use bing::*;
5
6mod duckduckgo;
7pub use duckduckgo::*;
8
9mod google;
10pub use google::*;
11
12pub use asimov_module::secrecy::{ExposeSecret, SecretString};
13
14use asimov_module::prelude::{Box, Result, String};
15use core::error::Error;
16
17#[derive(Debug)]
18pub struct SerpApi {
19 pub(crate) api_key: SecretString,
20}
21
22impl SerpApi {
23 pub fn new(api_key: SecretString) -> Self {
24 Self { api_key }
25 }
26
27 pub fn search_bing(&self, request: &BingSearchRequest) -> Result<String, Box<dyn Error>> {
29 let mut response = ureq::get("https://serpapi.com/search")
30 .query("engine", "bing")
31 .query("q", &request.q)
32 .query("api_key", self.api_key.expose_secret())
33 .call()?;
34 let response_body = response.body_mut().read_to_string()?;
35 Ok(response_body)
36 }
37
38 pub fn search_duckduckgo(
40 &self,
41 request: &DuckDuckGoSearchRequest,
42 ) -> Result<String, Box<dyn Error>> {
43 let mut response = ureq::get("https://serpapi.com/search")
44 .query("engine", "duckduckgo")
45 .query("q", &request.q)
46 .query("kl", request.kl.as_deref().unwrap_or_default())
47 .query("api_key", self.api_key.expose_secret())
48 .call()?;
49 let response_body = response.body_mut().read_to_string()?;
50 Ok(response_body)
51 }
52
53 pub fn search_google(&self, request: &GoogleSearchRequest) -> Result<String, Box<dyn Error>> {
55 let mut response = ureq::get("https://serpapi.com/search")
56 .query("engine", "google")
57 .query("q", &request.q)
58 .query("api_key", self.api_key.expose_secret())
59 .call()?;
60 let response_body = response.body_mut().read_to_string()?;
61 Ok(response_body)
62 }
63}