Skip to main content

asimov_serpapi_module/
api.rs

1// This is free and unencumbered software released into the public domain.
2
3mod 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    /// See: https://serpapi.com/bing-search-api
28    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    /// See: https://serpapi.com/duckduckgo-search-api
39    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    /// See: https://serpapi.com/search-api
54    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}