use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct SearchResult {
pub id: String,
pub title: String,
pub content: String,
pub subreddit: String,
pub upvotes: i32,
pub comments: i32,
pub created: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub relevance: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub similarity_score: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sentiment: Option<String>,
pub url: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SemanticSearchResponse {
pub success: bool,
pub data: Option<SemanticSearchData>,
pub error: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SemanticSearchData {
pub query: String,
pub results: Vec<SearchResult>,
pub total: i32,
pub processing_time_ms: i32,
pub ai_summary: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct VectorSearchResponse {
pub success: bool,
pub data: Option<VectorSearchData>,
pub error: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct VectorSearchData {
pub query: String,
pub results: Vec<SearchResult>,
pub total: i32,
pub processing_time_ms: i32,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TrendTopic {
pub id: String,
pub topic: String,
pub post_count: i32,
pub total_upvotes: i32,
pub total_comments: i32,
pub avg_sentiment: f64,
pub top_subreddits: Vec<String>,
pub trending_keywords: Vec<String>,
pub sample_posts: Vec<SamplePost>,
pub trend_score: f64,
pub growth_rate: f64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SamplePost {
pub id: String,
pub title: String,
pub subreddit: String,
pub upvotes: i32,
pub comments: i32,
pub created: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TrendsResponse {
pub success: bool,
pub data: Option<TrendsData>,
pub error: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TrendsData {
pub trends: Vec<TrendTopic>,
pub total: i32,
pub date_range: DateRange,
pub processing_time_ms: i32,
}
#[derive(Debug, Clone, Deserialize)]
pub struct DateRange {
pub start: String,
pub end: String,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Sonar {
pub id: String,
pub name: String,
pub query: String,
pub description: Option<String>,
pub enabled: bool,
pub schedule: String,
pub last_executed_at: Option<String>,
pub next_execution_at: Option<String>,
pub created_at: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SonarsResponse {
pub success: bool,
pub data: Option<SonarsData>,
pub error: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SonarsData {
pub sonars: Vec<Sonar>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateSonarOptions {
pub name: String,
pub query: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub schedule: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub triggers: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notify_email: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notify_slack: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub slack_webhook: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CreateSonarResponse {
pub success: bool,
pub data: Option<CreateSonarData>,
pub error: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CreateSonarData {
pub sonar: Sonar,
}