use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::model::{Kind, Scope};
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum SearchMode {
Fulltext,
Vector,
#[default]
Hybrid,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TimeRange {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub from: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub to: Option<DateTime<Utc>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Query {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub kind: Option<Kind>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scope: Option<Scope>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub time_range: Option<TimeRange>,
#[serde(default)]
pub mode: SearchMode,
#[serde(default = "default_limit")]
pub limit: u32,
}
fn default_limit() -> u32 {
20
}
impl Default for Query {
fn default() -> Self {
Self {
text: None,
source: None,
kind: None,
scope: None,
time_range: None,
mode: SearchMode::default(),
limit: default_limit(),
}
}
}