#![allow(missing_docs)]
use serde::Deserialize;
use std::collections::HashMap;
#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "snake_case")]
pub struct SearchResults {
pub search_metadata: SearchMetadata,
pub search_parameters: SearchParameters,
pub organic_results: Option<Vec<OrganicResult>>,
pub answer_box: Option<AnswerBox>,
pub knowledge_graph: Option<KnowledgeGraph>,
pub related_searches: Option<Vec<RelatedSearch>>,
pub pagination: Option<Pagination>,
pub ads: Option<Vec<Ad>>,
pub shopping_results: Option<Vec<ShoppingResult>>,
pub local_results: Option<LocalResults>,
pub news_results: Option<Vec<NewsResult>>,
pub video_results: Option<Vec<VideoResult>>,
pub inline_images: Option<Vec<InlineImage>>,
pub inline_videos: Option<Vec<InlineVideo>>,
pub short_videos: Option<Vec<ShortVideo>>,
pub search_information: Option<SearchInformation>,
pub serpapi_pagination: Option<SerpapiPagination>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct SearchMetadata {
pub id: String,
pub status: Option<String>,
pub json_endpoint: Option<String>,
pub created_at: Option<String>,
pub processed_at: Option<String>,
pub google_url: Option<String>,
pub raw_html_file: Option<String>,
pub total_time_taken: Option<f64>,
pub pixel_position_endpoint: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct SearchParameters {
pub engine: String,
#[serde(rename = "q")]
pub query: String,
pub google_domain: Option<String>,
#[serde(rename = "gl")]
pub geolocation: Option<String>,
#[serde(rename = "hl")]
pub language: Option<String>,
pub device: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct OrganicResult {
pub position: Option<u32>,
pub title: String,
pub link: String,
pub displayed_link: Option<String>,
pub snippet: Option<String>,
pub snippet_highlighted_words: Option<Vec<String>>,
pub cached_page_link: Option<String>,
pub date: Option<String>,
pub rich_snippet: Option<RichSnippet>,
pub about_this_result: Option<AboutThisResult>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct RichSnippet {
pub top: Option<HashMap<String, String>>,
pub bottom: Option<HashMap<String, String>>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct AboutThisResult {
pub source: Option<Source>,
pub keywords: Option<Vec<String>>,
pub related_keywords: Option<Vec<String>>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct Source {
pub description: Option<String>,
pub source_info_link: Option<String>,
pub security: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct AnswerBox {
#[serde(rename = "type")]
pub answer_type: String,
pub title: Option<String>,
pub answer: Option<String>,
pub snippet: Option<String>,
pub snippet_highlighted_words: Option<Vec<String>>,
pub link: Option<String>,
pub displayed_link: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct KnowledgeGraph {
pub title: String,
#[serde(rename = "type")]
pub knowledge_type: Option<String>,
pub kgmid: Option<String>,
pub knowledge_graph_search_link: Option<String>,
pub serpapi_knowledge_graph_search_link: Option<String>,
pub description: Option<String>,
pub source: Option<Source>,
pub thumbnail: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(untagged)]
pub enum RelatedSearch {
Simple {
query: String,
link: Option<String>,
serpapi_link: Option<String>,
},
Block {
block_position: Option<u32>,
items: Vec<RelatedSearchItem>,
},
}
#[derive(Debug, Deserialize, Clone)]
pub struct RelatedSearchItem {
pub name: Option<String>,
pub query: Option<String>,
pub link: Option<String>,
pub serpapi_link: Option<String>,
pub image: Option<String>,
pub stick: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct Pagination {
pub current: u32,
pub next: Option<String>,
pub next_link: Option<String>,
pub serpapi_next_link: Option<String>,
pub other_pages: Option<HashMap<String, String>>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct Ad {
pub position: Option<u32>,
pub title: String,
pub link: String,
pub displayed_link: Option<String>,
pub description: Option<String>,
pub sitelinks: Option<Vec<SiteLink>>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct SiteLink {
pub title: String,
pub link: String,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ShoppingResult {
pub position: Option<u32>,
pub title: String,
pub link: Option<String>,
pub product_link: Option<String>,
pub product_id: Option<String>,
pub serpapi_product_api: Option<String>,
pub source: Option<String>,
pub price: Option<String>,
pub extracted_price: Option<f64>,
pub rating: Option<f64>,
pub reviews: Option<u32>,
pub extensions: Option<Vec<String>>,
pub thumbnail: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct LocalResults {
pub more_locations_link: Option<String>,
pub places: Option<Vec<LocalPlace>>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct LocalPlace {
pub position: Option<u32>,
pub title: String,
pub place_id: String,
pub data_id: String,
pub data_cid: String,
pub reviews_link: String,
pub photos_link: String,
pub gps_coordinates: Option<GpsCoordinates>,
pub place_id_search: String,
pub provider_id: String,
pub rating: Option<f64>,
pub reviews: Option<u32>,
pub price: Option<String>,
pub type_: Option<String>,
pub types: Option<Vec<String>>,
pub address: String,
pub open_state: Option<String>,
pub hours: Option<String>,
pub operating_hours: Option<HashMap<String, String>>,
pub phone: Option<String>,
pub website: Option<String>,
pub description: Option<String>,
pub service_options: Option<HashMap<String, bool>>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct GpsCoordinates {
pub latitude: f64,
pub longitude: f64,
}
#[derive(Debug, Deserialize, Clone)]
pub struct NewsResult {
pub position: Option<u32>,
pub title: String,
pub link: String,
pub source: Option<String>,
pub date: Option<String>,
pub snippet: Option<String>,
pub thumbnail: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct VideoResult {
pub position: Option<u32>,
pub title: String,
pub link: String,
pub displayed_link: Option<String>,
pub thumbnail: Option<String>,
pub channel: Option<String>,
pub duration: Option<String>,
pub platform: Option<String>,
pub date: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct InlineImage {
pub position: Option<u32>,
pub title: Option<String>,
pub link: Option<String>,
pub source: Option<String>,
pub source_name: Option<String>,
pub source_logo: Option<String>,
pub thumbnail: Option<String>,
pub original: Option<String>,
pub is_product: Option<bool>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct InlineVideo {
pub position: Option<u32>,
pub title: Option<String>,
pub link: Option<String>,
pub thumbnail: Option<String>,
pub channel: Option<String>,
pub duration: Option<String>,
pub platform: Option<String>,
pub date: Option<String>,
pub key_moments: Option<Vec<KeyMoment>>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct KeyMoment {
pub time: Option<String>,
pub title: Option<String>,
pub link: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ShortVideo {
pub position: Option<u32>,
pub title: Option<String>,
pub link: Option<String>,
pub thumbnail: Option<String>,
pub channel: Option<String>,
pub duration: Option<String>,
pub platform: Option<String>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct SearchInformation {
pub organic_results_state: Option<String>,
pub query_displayed: Option<String>,
pub time_taken_displayed: Option<f64>,
pub total_results: Option<u64>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct SerpapiPagination {
pub current: Option<u32>,
pub next: Option<String>,
pub next_link: Option<String>,
pub other_pages: Option<HashMap<String, String>>,
}