use crate::DataForSeoApiResponse;
use crate::DataForSeoClient;
use crate::api::keywords_data::KeywordsDataApi;
use crate::entity::{
KeywordsDataApiClickstreamBulkSearchVolume, KeywordsDataApiClickstreamGlobalSearchVolume,
KeywordsDataApiClickstreamLocation, KeywordsDataApiClickstreamSearchVolume,
};
use serde::{Deserialize, Serialize};
impl KeywordsDataApi<'_> {
pub fn clickstream_data(&self) -> KeywordsDataApiClickstream<'_> {
KeywordsDataApiClickstream {
client: self.client,
}
}
}
pub struct KeywordsDataApiClickstream<'a> {
pub(crate) client: &'a DataForSeoClient,
}
impl KeywordsDataApiClickstream<'_> {
pub async fn locations_and_languages(
&self,
) -> DataForSeoApiResponse<KeywordsDataApiClickstreamLocation> {
self.client
.http_get("/v3/keywords_data/clickstream_data/locations_and_languages")
.await
}
pub async fn dataforseo_search_volume_live(
&self,
data: Vec<KeywordsDataApiClickstreamSearchVolumeRequest>,
) -> DataForSeoApiResponse<KeywordsDataApiClickstreamSearchVolume> {
self.client
.http_post(
"/v3/keywords_data/clickstream_data/dataforseo_search_volume/live",
&data,
)
.await
}
pub async fn global_search_volume_live(
&self,
data: Vec<KeywordsDataApiClickstreamGlobalSearchVolumeRequest>,
) -> DataForSeoApiResponse<KeywordsDataApiClickstreamGlobalSearchVolume> {
self.client
.http_post(
"/v3/keywords_data/clickstream_data/global_search_volume/live",
&data,
)
.await
}
pub async fn bulk_search_volume_live(
&self,
data: Vec<KeywordsDataApiClickstreamBulkSearchVolumeRequest>,
) -> DataForSeoApiResponse<KeywordsDataApiClickstreamBulkSearchVolume> {
self.client
.http_post(
"/v3/keywords_data/clickstream_data/bulk_search_volume/live",
&data,
)
.await
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct KeywordsDataApiClickstreamSearchVolumeRequest {
pub keywords: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub location_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub location_code: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub language_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub language_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub use_clickstream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
impl KeywordsDataApiClickstreamSearchVolumeRequest {
pub fn new(keywords: Vec<String>) -> Self {
KeywordsDataApiClickstreamSearchVolumeRequest {
keywords,
..KeywordsDataApiClickstreamSearchVolumeRequest::default()
}
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct KeywordsDataApiClickstreamGlobalSearchVolumeRequest {
pub keywords: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
impl KeywordsDataApiClickstreamGlobalSearchVolumeRequest {
pub fn new(keywords: Vec<String>) -> Self {
KeywordsDataApiClickstreamGlobalSearchVolumeRequest {
keywords,
..KeywordsDataApiClickstreamGlobalSearchVolumeRequest::default()
}
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct KeywordsDataApiClickstreamBulkSearchVolumeRequest {
pub keywords: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub location_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub location_code: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
impl KeywordsDataApiClickstreamBulkSearchVolumeRequest {
pub fn new(keywords: Vec<String>) -> Self {
KeywordsDataApiClickstreamBulkSearchVolumeRequest {
keywords,
..KeywordsDataApiClickstreamBulkSearchVolumeRequest::default()
}
}
}