use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsKeywordInfo {
pub se_type: Option<String>,
pub last_updated_time: Option<String>,
pub competition: Option<f64>,
pub competition_level: Option<String>,
pub cpc: Option<f64>,
pub search_volume: Option<i64>,
pub low_top_of_page_bid: Option<f64>,
pub high_top_of_page_bid: Option<f64>,
pub categories: Option<Vec<i64>>,
pub monthly_searches: Option<Vec<DataForSeoLabsMonthlySearch>>,
pub search_volume_trend: Option<DataForSeoLabsSearchVolumeTrend>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsMonthlySearch {
pub year: Option<i64>,
pub month: Option<i64>,
pub search_volume: Option<i64>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsSearchVolumeTrend {
pub monthly: Option<i64>,
pub quarterly: Option<i64>,
pub yearly: Option<i64>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsKeywordInfoNormalized {
pub se_type: Option<String>,
pub last_updated_time: Option<String>,
pub is_normalized: Option<bool>,
pub search_volume: Option<i64>,
pub monthly_searches: Option<Vec<DataForSeoLabsMonthlySearch>>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsClickstreamKeywordInfo {
pub se_type: Option<String>,
pub last_updated_time: Option<String>,
pub search_volume: Option<i64>,
pub gender_distribution: Option<DataForSeoLabsGenderDistribution>,
pub age_distribution: Option<DataForSeoLabsAgeDistribution>,
pub monthly_searches: Option<Vec<DataForSeoLabsMonthlySearch>>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsKeywordProperties {
pub se_type: Option<String>,
pub core_keyword: Option<String>,
pub synonym_clustering_algorithm: Option<String>,
pub keyword_difficulty: Option<i64>,
pub detected_language: Option<String>,
pub is_another_language: Option<bool>,
pub words_count: Option<i64>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsImpressionsInfo {
pub se_type: Option<String>,
pub last_updated_time: Option<String>,
pub bid: Option<f64>,
pub match_type: Option<String>,
pub ad_position_min: Option<f64>,
pub ad_position_max: Option<f64>,
pub ad_position_average: Option<f64>,
pub cpc_min: Option<f64>,
pub cpc_max: Option<f64>,
pub cpc_average: Option<f64>,
pub daily_impressions_min: Option<f64>,
pub daily_impressions_max: Option<f64>,
pub daily_impressions_average: Option<f64>,
pub daily_clicks_min: Option<f64>,
pub daily_clicks_max: Option<f64>,
pub daily_clicks_average: Option<f64>,
pub daily_cost_min: Option<f64>,
pub daily_cost_max: Option<f64>,
pub daily_cost_average: Option<f64>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsSerpInfo {
pub se_type: Option<String>,
pub check_url: Option<String>,
pub serp_item_types: Option<Vec<String>>,
pub se_results_count: Option<i64>,
pub last_updated_time: Option<String>,
pub previous_updated_time: Option<String>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsAvgBacklinksInfo {
pub se_type: Option<String>,
pub backlinks: Option<f64>,
pub dofollow: Option<f64>,
pub referring_pages: Option<f64>,
pub referring_domains: Option<f64>,
pub referring_main_domains: Option<f64>,
pub rank: Option<f64>,
pub main_domain_rank: Option<f64>,
pub last_updated_time: Option<String>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsSearchIntentInfo {
pub se_type: Option<String>,
pub main_intent: Option<String>,
pub foreign_intent: Option<Vec<String>>,
pub last_updated_time: Option<String>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsKeywordData {
pub se_type: Option<String>,
pub keyword: Option<String>,
pub location_code: Option<i32>,
pub language_code: Option<String>,
pub keyword_info: Option<DataForSeoLabsKeywordInfo>,
pub keyword_info_normalized_with_bing: Option<DataForSeoLabsKeywordInfoNormalized>,
pub keyword_info_normalized_with_clickstream: Option<DataForSeoLabsKeywordInfoNormalized>,
pub clickstream_keyword_info: Option<DataForSeoLabsClickstreamKeywordInfo>,
pub keyword_properties: Option<DataForSeoLabsKeywordProperties>,
pub impressions_info: Option<DataForSeoLabsImpressionsInfo>,
pub serp_info: Option<DataForSeoLabsSerpInfo>,
pub avg_backlinks_info: Option<DataForSeoLabsAvgBacklinksInfo>,
pub search_intent_info: Option<DataForSeoLabsSearchIntentInfo>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsGenderDistribution {
pub female: Option<i64>,
pub male: Option<i64>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsAgeDistribution {
#[serde(rename = "18-24")]
pub age_18_24: Option<i64>,
#[serde(rename = "25-34")]
pub age_25_34: Option<i64>,
#[serde(rename = "35-44")]
pub age_35_44: Option<i64>,
#[serde(rename = "45-54")]
pub age_45_54: Option<i64>,
#[serde(rename = "55-64")]
pub age_55_64: Option<i64>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsMetrics {
pub organic: Option<DataForSeoLabsMetricsInfo>,
pub paid: Option<DataForSeoLabsMetricsInfo>,
pub featured_snippet: Option<DataForSeoLabsMetricsInfo>,
pub local_pack: Option<DataForSeoLabsMetricsInfo>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsMetricsInfo {
pub pos_1: Option<i64>,
pub pos_2_3: Option<i64>,
pub pos_4_10: Option<i64>,
pub pos_11_20: Option<i64>,
pub pos_21_30: Option<i64>,
pub pos_31_40: Option<i64>,
pub pos_41_50: Option<i64>,
pub pos_51_60: Option<i64>,
pub pos_61_70: Option<i64>,
pub pos_71_80: Option<i64>,
pub pos_81_90: Option<i64>,
pub pos_91_100: Option<i64>,
pub etv: Option<f64>,
pub impressions_etv: Option<f64>,
pub count: Option<i64>,
pub estimated_paid_traffic_cost: Option<f64>,
pub is_new: Option<i64>,
pub is_up: Option<i64>,
pub is_down: Option<i64>,
pub is_lost: Option<i64>,
pub clickstream_etv: Option<f64>,
pub clickstream_gender_distribution: Option<DataForSeoLabsGenderDistribution>,
pub clickstream_age_distribution: Option<DataForSeoLabsAgeDistribution>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsRankedSerpElement {
pub se_type: Option<String>,
pub serp_item: Option<DataForSeoLabsSerpItem>,
pub check_url: Option<String>,
pub serp_item_types: Option<Vec<String>>,
pub se_results_count: Option<i64>,
pub last_updated_time: Option<String>,
pub previous_updated_time: Option<String>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsSerpItem {
pub se_type: Option<String>,
#[serde(rename = "type")]
pub item_type: Option<String>,
pub rank_group: Option<i64>,
pub rank_absolute: Option<i64>,
pub position: Option<String>,
pub xpath: Option<String>,
pub domain: Option<String>,
pub title: Option<String>,
pub url: Option<String>,
pub relative_url: Option<String>,
pub description: Option<String>,
pub etv: Option<f64>,
pub impressions_etv: Option<f64>,
pub estimated_paid_traffic_cost: Option<f64>,
pub clickstream_etv: Option<f64>,
pub rank_changes: Option<DataForSeoLabsRankChanges>,
pub backlinks_info: Option<DataForSeoLabsSerpBacklinksInfo>,
pub rank_info: Option<DataForSeoLabsRankInfo>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsRankChanges {
pub previous_rank_absolute: Option<i64>,
pub is_new: Option<bool>,
pub is_up: Option<bool>,
pub is_down: Option<bool>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsSerpBacklinksInfo {
pub se_type: Option<String>,
pub referring_domains: Option<i64>,
pub referring_main_domains: Option<i64>,
pub referring_pages: Option<i64>,
pub dofollow: Option<i64>,
pub backlinks: Option<i64>,
pub time_update: Option<String>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsRankInfo {
pub page_rank: Option<i64>,
pub main_domain_rank: Option<i64>,
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoLabsResult<T> {
pub se_type: Option<String>,
pub target: Option<String>,
pub target1: Option<String>,
pub target2: Option<String>,
pub app_id: Option<String>,
pub app_ids: Option<HashMap<String, String>>,
pub keyword: Option<String>,
pub seed_keyword: Option<String>,
pub seed_keywords: Option<Vec<String>>,
pub location_code: Option<i32>,
pub language_code: Option<String>,
pub total_count: Option<i64>,
pub items_count: Option<i64>,
pub offset: Option<i32>,
pub offset_token: Option<String>,
pub metrics: Option<DataForSeoLabsMetrics>,
pub metrics_absolute: Option<DataForSeoLabsMetrics>,
pub items: Option<Vec<T>>,
}
impl<T> DataForSeoLabsResult<T> {
pub fn items(&self) -> &[T] {
self.items.as_deref().unwrap_or_default()
}
}
pub type DataForSeoLabsRawItem = Value;