use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct SearchHistoryId(pub String);
impl SearchHistoryId {
pub fn new(s: impl Into<String>) -> Self {
Self(s.into())
}
pub fn as_str(&self) -> &str {
&self.0
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum StoredSearchFilter {
Folder {
id: String,
label: String,
},
Kind {
value: StoredKindFilter,
label: String,
},
Changed {
value: StoredChangedFilter,
label: String,
},
ReadyStatus {
value: StoredReadyFilter,
label: String,
},
SearchStyle {
value: StoredSearchStyle,
label: String,
},
Language {
value: StoredLanguageFilter,
label: String,
},
}
impl StoredSearchFilter {
pub fn label(&self) -> &str {
match self {
Self::Folder { label, .. }
| Self::Kind { label, .. }
| Self::Changed { label, .. }
| Self::ReadyStatus { label, .. }
| Self::SearchStyle { label, .. }
| Self::Language { label, .. } => label,
}
}
pub fn folder_id(&self) -> Option<&str> {
match self {
Self::Folder { id, .. } => Some(id.as_str()),
_ => None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum StoredKindFilter {
Documents,
Pdfs,
Notes,
Code,
Spreadsheets,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum StoredChangedFilter {
AnyTime,
Today,
ThisWeek,
ThisMonth,
ThisYear,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum StoredReadyFilter {
Ready,
NeedsUpdate,
FileNotFound,
PartlyPrepared,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum StoredSearchStyle {
BestResults,
ExactWords,
Meaning,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum StoredLanguageFilter {
Any,
English,
Japanese,
Mixed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchHistoryEntry {
pub id: SearchHistoryId,
pub search_text: String,
pub filters: Vec<StoredSearchFilter>,
pub created_at: String,
pub last_used_at: String,
pub previous_result_count: Option<usize>,
pub locale: String,
}
impl SearchHistoryEntry {
pub fn accessible_label(&self) -> String {
let mut parts = vec![self.search_text.clone()];
for f in &self.filters {
parts.push(f.label().to_string());
}
parts.push(self.last_used_at.clone());
parts.join(", ")
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchHistorySettings {
pub remember_recent_searches: bool,
pub max_entries: usize,
pub clear_when_privacy_strict: bool,
}
impl Default for SearchHistorySettings {
fn default() -> Self {
Self {
remember_recent_searches: true,
max_entries: 20,
clear_when_privacy_strict: true,
}
}
}