#![allow(warnings)]
#![allow(dead_code)]
use std::collections::HashMap;
pub struct Client {
pub parameter: HashMap<String, String>,
pub http: reqwest::Client,
}
const HOST: &str = "http://serpapi.com";
impl Client {
pub fn new(parameter: HashMap<String, String>) -> Result<Client, Box<dyn std::error::Error>> {
let http = reqwest::Client::builder().build()?;
let client = Client { parameter, http };
Ok(client)
}
pub async fn search(
&self,
parameter: HashMap<String, String>,
) -> Result<serde_json::Value, Box<dyn std::error::Error>> {
let results = self.json("/search", parameter).await?;
Ok(results)
}
pub async fn html(
&self,
parameter: HashMap<String, String>,
) -> Result<String, Box<dyn std::error::Error>> {
let body = self.get("/html", parameter).await?;
Ok(body)
}
pub async fn location(
&self,
parameter: HashMap<String, String>,
) -> Result<serde_json::Value, Box<dyn std::error::Error>> {
let results = self.json("/locations.json", parameter).await?;
Ok(results)
}
pub async fn search_archive(
&self,
search_id: &str,
) -> Result<serde_json::Value, Box<dyn std::error::Error>> {
let mut endpoint = "/searches/".to_string();
endpoint.push_str(search_id);
endpoint.push_str(".json");
println!(">> {}", endpoint);
let results = self.json(&endpoint, HashMap::new()).await?;
Ok(results)
}
pub async fn account(
&self,
parameter: HashMap<String, String>,
) -> Result<serde_json::Value, Box<dyn std::error::Error>> {
let results = self.json("/account", parameter).await?;
Ok(results)
}
pub async fn json(
&self,
endpoint: &str,
parameter: HashMap<String, String>,
) -> Result<serde_json::Value, Box<dyn std::error::Error>> {
let body = self.get(endpoint, parameter).await?;
let value: serde_json::Value = serde_json::from_str(&body).unwrap();
Ok(value)
}
pub async fn get(
&self,
endpoint: &str,
parameter: HashMap<String, String>,
) -> Result<String, Box<dyn std::error::Error>> {
let mut query = HashMap::<String, String>::new();
query.insert("source".to_string(), "rust".to_string());
for (key, value) in self.parameter.iter() {
if !parameter.contains_key(key) {
query.insert(key.to_string(), value.to_string());
}
}
for (key, value) in parameter.iter() {
query.insert(key.to_string(), value.to_string());
}
let mut url = HOST.to_string();
url.push_str(endpoint);
let res = self.http.get(url).query(&query).send().await?;
let body = res.text().await?;
Ok(body)
}
}