use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, Deserialize, Serialize, JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum KindFilter {
Text,
Image,
Any,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct GetRecentArgs {
#[serde(default = "default_recent_n")]
pub n: u32,
#[serde(default)]
pub kind: Option<KindFilter>,
}
fn default_recent_n() -> u32 {
5
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct SearchArgs {
pub query: String,
#[serde(default = "default_search_limit")]
pub limit: u32,
#[serde(default)]
pub since: Option<String>,
}
fn default_search_limit() -> u32 {
20
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ListTodayArgs {
#[serde(default)]
pub kind: Option<KindFilter>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ClearSinceArgs {
pub ts: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct OcrImageArgs {
pub path: String,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct CaptureList {
pub captures: Vec<CaptureSummary>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct SearchResults {
pub hits: Vec<SearchResult>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct CaptureSummary {
pub id: i64,
pub ts: String,
pub kind: String,
pub sha256: String,
pub size_bytes: usize,
pub text: Option<String>,
pub md_path: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_app: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ocr_confidence: Option<f32>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct SearchResult {
pub capture: CaptureSummary,
#[serde(skip_serializing_if = "Option::is_none")]
pub duplicate_of: Option<i64>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct OcrResult {
pub text: String,
pub confidence: f32,
pub block_count: usize,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct OcrLatestResult {
pub text: Option<String>,
pub confidence: Option<f32>,
pub captured_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct ClearSinceResult {
pub deleted_count: usize,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn get_recent_defaults_when_args_missing() {
let args: GetRecentArgs = serde_json::from_str("{}").unwrap();
assert_eq!(args.n, 5);
assert!(args.kind.is_none());
}
#[test]
fn search_defaults_limit_to_20() {
let args: SearchArgs = serde_json::from_str(r#"{"query":"x"}"#).unwrap();
assert_eq!(args.limit, 20);
assert!(args.since.is_none());
}
#[test]
fn kind_filter_serializes_lowercase() {
let s = serde_json::to_string(&KindFilter::Image).unwrap();
assert_eq!(s, "\"image\"");
let parsed: KindFilter = serde_json::from_str("\"any\"").unwrap();
assert_eq!(parsed, KindFilter::Any);
}
}