use crate::entity::{
SerpApiElementAiOverview, SerpApiElementAnswerBox, SerpApiElementCarousel,
SerpApiElementFeaturedSnippet, SerpApiElementHotelsPack, SerpApiElementKnowledgeGraph,
SerpApiElementLocalPack, SerpApiElementMultiCarousel, SerpApiElementOrganic,
SerpApiElementPaid, SerpApiElementPeopleAlsoAsk, SerpApiElementPeopleAlsoSearch,
SerpApiElementRefinementChips, SerpApiElementRelatedSearches, SerpApiGoogleOrganicTaskSpell,
};
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct SerpApiGoogleOrganicTaskRegular {
pub keyword: String,
#[serde(rename = "type")]
pub search_engine_type: Option<String>,
pub se_domain: Option<String>,
pub location_code: i32,
pub language_code: Option<String>,
pub check_url: Option<String>,
pub datetime: Option<String>,
pub spell: Option<SerpApiGoogleOrganicTaskSpell>,
pub refinement_chips: Option<SerpApiElementRefinementChips>,
pub item_types: Option<Vec<String>>,
pub se_results_count: Option<i64>,
pub items_count: Option<i64>,
pub items: Option<Vec<SerpApiGoogleOrganicItem>>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct SerpApiGoogleOrganicTaskAdvanced {
pub keyword: String,
#[serde(rename = "type")]
pub search_engine_type: Option<String>,
pub se_domain: Option<String>,
pub location_code: i32,
pub language_code: Option<String>,
pub check_url: Option<String>,
pub datetime: Option<String>,
pub spell: Option<SerpApiGoogleOrganicTaskSpell>,
pub refinement_chips: Option<SerpApiElementRefinementChips>,
pub item_types: Option<Vec<String>>,
pub se_results_count: Option<i64>,
pub items_count: Option<i64>,
pub items: Option<Vec<SerpApiGoogleOrganicItem>>,
}
impl SerpApiGoogleOrganicTaskAdvanced {
pub fn items(&self) -> &[SerpApiGoogleOrganicItem] {
self.items.as_deref().unwrap_or_default()
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum SerpApiGoogleOrganicItem {
#[serde(rename = "answer_box")]
AnswerBox(Box<SerpApiElementAnswerBox>),
#[serde(rename = "carousel")]
Carousel(Box<SerpApiElementCarousel>),
#[serde(rename = "multi_carousel")]
MultiCarousel(Box<SerpApiElementMultiCarousel>),
#[serde(rename = "featured_snippet")]
FeaturedSnippet(Box<SerpApiElementFeaturedSnippet>),
#[serde(rename = "knowledge_graph")]
KnowledgeGraph(Box<SerpApiElementKnowledgeGraph>),
#[serde(rename = "local_pack")]
LocalPack(Box<SerpApiElementLocalPack>),
#[serde(rename = "hotels_pack")]
HotelsPack(Box<SerpApiElementHotelsPack>),
#[serde(rename = "people_also_ask")]
PeopleAlsoAsk(Box<SerpApiElementPeopleAlsoAsk>),
#[serde(rename = "organic")]
Organic(Box<SerpApiElementOrganic>),
#[serde(rename = "paid")]
Paid(Box<SerpApiElementPaid>),
#[serde(rename = "related_searches")]
RelatedSearches(Box<SerpApiElementRelatedSearches>),
#[serde(rename = "people_also_search")]
PeopleAlsoSearch(Box<SerpApiElementPeopleAlsoSearch>),
#[serde(rename = "ai_overview")]
AiOverview(Box<SerpApiElementAiOverview>),
#[serde(untagged)]
Unknown(Value),
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct SerpApiGoogleOrganicItemPaidExtra {
pub ad_aclk: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct SerpApiElementHotelsPackElementPrice {
pub current: Option<f64>,
pub regular: Option<f64>,
pub max_value: Option<f64>,
pub currency: Option<String>,
pub is_price_range: Option<bool>,
pub displayed_price: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct SerpApiElementTopStoriesElement {
#[serde(rename = "type")]
pub type_of_element: Option<String>,
pub source: Option<String>,
pub domain: Option<String>,
pub title: Option<String>,
pub date: Option<String>,
pub amp_version: Option<bool>,
pub timestamp: Option<String>,
pub url: Option<String>,
pub image_url: Option<String>,
pub badges: Option<Vec<String>>,
}