Skip to main content

deepstore_client/
types.rs

1//! Public types for DeepStore client
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use serde_json::Value as JsonValue;
6
7/// Parameters for searching logs
8#[derive(Debug, Clone)]
9pub struct SearchParams {
10    /// Database ID to search in
11    pub database_id: String,
12    /// Query string (e.g., "level:error", "*")
13    pub query: String,
14    /// Start time for search range
15    pub start_time: DateTime<Utc>,
16    /// End time for search range
17    pub end_time: DateTime<Utc>,
18    /// Maximum number of hits to return
19    pub max_hits: Option<usize>,
20    /// Sorting field (e.g., "-timestamp_nanos" for desc)
21    pub sort_by: Option<String>,
22    /// Start offset for pagination
23    pub start_offset: Option<usize>,
24    /// Search after cursor for pagination
25    pub search_after: Option<Vec<JsonValue>>,
26    /// Fields to include snippets for
27    pub snippet_fields: Option<Vec<String>>,
28    /// Fields to search in
29    pub search_fields: Option<Vec<String>>,
30    /// Aggregations to compute
31    pub aggregations: Option<JsonValue>,
32    /// Scopes to filter by (optional - usually comes from JWT)
33    pub scopes: Option<Vec<String>>,
34}
35
36impl Default for SearchParams {
37    fn default() -> Self {
38        Self {
39            database_id: String::new(),
40            query: "*".to_string(),
41            start_time: Utc::now() - chrono::Duration::hours(1),
42            end_time: Utc::now(),
43            max_hits: Some(100),
44            sort_by: Some("-timestamp_nanos".to_string()),
45            start_offset: None,
46            search_after: None,
47            snippet_fields: None,
48            search_fields: None,
49            aggregations: None,
50            scopes: None,
51        }
52    }
53}
54
55/// Search results from DeepStore
56#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct SearchResult {
58    /// Total number of matching documents
59    pub num_hits: usize,
60    /// Array of document hits
61    pub hits: Vec<JsonValue>,
62    /// Optional snippets for highlighted text
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub snippets: Option<Vec<JsonValue>>,
65    /// Query execution time in microseconds
66    pub elapsed_time_micros: u64,
67    /// Any errors encountered during search
68    pub errors: Vec<String>,
69    /// Optional aggregation results
70    #[serde(skip_serializing_if = "Option::is_none")]
71    pub aggregations: Option<JsonValue>,
72}
73
74/// Query token provider function
75pub type QueryTokenProvider = Box<
76    dyn Fn() -> std::pin::Pin<Box<dyn std::future::Future<Output = crate::Result<String>> + Send>>
77        + Send
78        + Sync,
79>;