mod ai_optimization;
mod app_data;
mod appendix;
mod backlinks;
mod business_data;
mod content_analysis;
mod content_generation;
mod dataforseo_labs;
mod domain_analytics;
mod keywords_data;
mod merchant;
mod on_page;
mod serp;
pub use ai_optimization::*;
pub use app_data::*;
pub use appendix::*;
pub use backlinks::*;
pub use business_data::*;
pub use content_analysis::*;
pub use content_generation::*;
pub use dataforseo_labs::*;
pub use domain_analytics::*;
pub use keywords_data::*;
pub use merchant::*;
pub use on_page::*;
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub use serp::*;
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoApiResponseData<R> {
pub version: String,
pub status_code: i32,
pub status_message: String,
pub time: String,
pub cost: f64,
pub tasks_count: i32,
pub tasks_error: i32,
pub limit: Option<i32>,
pub offset: Option<i32>,
pub sort: Option<String>,
pub include_metadata: Option<bool>,
pub tasks: Option<Vec<DataForSeoApiTask<R>>>,
}
impl<R> DataForSeoApiResponseData<R> {
pub fn tasks(&self) -> &[DataForSeoApiTask<R>] {
self.tasks.as_deref().unwrap_or_default()
}
pub fn into_tasks(self) -> Vec<DataForSeoApiTask<R>> {
self.tasks.unwrap_or_default()
}
pub fn results(&self) -> impl Iterator<Item = &R> {
self.tasks().iter().flat_map(|task| task.results().iter())
}
pub fn into_results(self) -> Vec<R> {
self.into_tasks()
.into_iter()
.flat_map(|task| task.result.unwrap_or_default())
.collect()
}
pub fn first_result(&self) -> Option<&R> {
self.results().next()
}
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct DataForSeoApiTask<R> {
pub id: String,
pub status_code: i32,
pub status_message: String,
pub time: String,
pub cost: f64,
pub path: Vec<String>,
pub data: Value,
pub result: Option<Vec<R>>,
}
impl<R> DataForSeoApiTask<R> {
pub fn results(&self) -> &[R] {
self.result.as_deref().unwrap_or_default()
}
pub fn is_success(&self) -> bool {
matches!(self.task_status(), TaskStatus::RequestSuccess(_))
}
pub fn task_status(&self) -> TaskStatus {
match self.status_code {
20000..=29999 => TaskStatus::RequestSuccess(self.status_code),
40601 | 40602 => TaskStatus::TaskWaiting(self.status_code),
40401 => TaskStatus::TaskNotFound(self.status_code),
40202 => TaskStatus::RateLimit(self.status_code),
other => TaskStatus::Other(other),
}
}
}
#[derive(Debug, Clone)]
pub enum TaskStatus {
RequestSuccess(i32),
TaskWaiting(i32),
TaskNotFound(i32),
RateLimit(i32),
Other(i32),
}
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct SerpApiTaskResult<T> {
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<Value>,
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<T>>,
}
impl<T> SerpApiTaskResult<T> {
pub fn items(&self) -> &[T] {
self.items.as_deref().unwrap_or_default()
}
}