use cueward_core::files::{FileError, FileInfo};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpotlightRequest {
pub root: PathBuf,
pub text: String,
pub max_depth: usize,
pub hidden: bool,
pub max_candidates: usize,
pub limit: usize,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SpotlightSource {
Spotlight,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum IndexCoverage {
Unknown,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "status", rename_all = "snake_case")]
pub enum SpotlightEntry {
Available {
relative_path: String,
file: Box<FileInfo>,
},
Error {
relative_path: String,
error: FileError,
},
}
impl SpotlightEntry {
pub(super) fn relative_path(&self) -> &str {
match self {
Self::Available { relative_path, .. } | Self::Error { relative_path, .. } => {
relative_path
}
}
}
}
#[derive(Debug, Default, Serialize, Deserialize)]
pub struct ExcludedCandidates {
pub outside_scope: usize,
pub hidden: usize,
pub depth: usize,
pub non_regular: usize,
pub duplicate: usize,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SpotlightResult {
pub root: FileInfo,
pub source: SpotlightSource,
pub query: SpotlightRequest,
pub query_completed: bool,
pub index_coverage: IndexCoverage,
pub enumeration_complete: bool,
pub content_verified: bool,
pub candidate_count: usize,
pub eligible_count: usize,
pub available_count: usize,
pub error_count: usize,
pub excluded: ExcludedCandidates,
pub entries: Vec<SpotlightEntry>,
pub truncated: bool,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "operation", content = "result", rename_all = "snake_case")]
pub enum SpotlightResponse {
Spotlight(SpotlightResult),
}