use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchRequest {
pub query: String,
pub depth: SearchDepth,
pub limit: u32,
pub output: OutputFormat,
pub language: Option<String>,
pub date_range: Option<DateRange>,
pub domains: Option<DomainFilter>,
pub content_type: Option<ContentType>,
pub include_content: bool,
pub include_graph: bool,
pub include_keywords: bool,
pub include_metrics: bool,
#[serde(default)]
pub hybrid: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SearchDepth {
Shallow,
#[default]
Standard,
Deep,
Comprehensive,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DateRange {
pub after: Option<DateTime<Utc>>,
pub before: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DomainFilter {
pub include: Option<Vec<String>>,
pub exclude: Option<Vec<String>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ContentType {
Article,
Tutorial,
Documentation,
News,
Forum,
#[default]
Any,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum OutputFormat {
Json,
#[default]
Report,
Markdown,
}