use serde::{Deserialize, Serialize}; use serde_json::Value; #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct SearchQuery { pub query: String, pub workspace_id: String, pub scope: SearchScope, #[serde(skip_serializing_if = "Option::is_none")] pub page_id: Option, pub limit: u32, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub enum SearchScope { Workspace, CurrentPage, Pinned, Recent, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct SearchResultProjection { pub id: String, pub title: String, pub snippet: String, #[serde(skip_serializing_if = "Option::is_none")] pub updated_at: Option, #[serde(skip_serializing_if = "Option::is_none")] pub created_at: Option, pub match_field: String, pub has_ocr: bool, pub public_path: String, #[serde(skip_serializing_if = "Option::is_none")] pub node_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub subtree_root_id: Option, #[serde(default)] pub evidence: Vec, pub score: f64, pub projection_owner: SearchProjectionOwner, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct SearchHighlight { pub kind: String, #[serde(skip_serializing_if = "Option::is_none")] pub node_id: Option, pub snippet: String, #[serde(default, skip_serializing_if = "Value::is_null")] pub meta: Value, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "kebab-case")] pub enum SearchProjectionOwner { RustKernel, CompatIndex, }