use std::path::PathBuf;
use serde::{Deserialize, Serialize};
use crate::app::cli::IndexReport;
use crate::domain::corpus::sandbox::{FileEntry, TreeNode};
use crate::domain::ground::GroundResponse;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DaemonRequest {
pub cwd: PathBuf,
pub payload: DaemonRequestPayload,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "op", rename_all = "snake_case")]
pub enum DaemonRequestPayload {
Ping,
Ground(GroundRequest),
Index(IndexRequest),
ListCorpora,
ListFiles(ListFilesRequest),
ListTree(ListTreeRequest),
AddMarkdown(AddMarkdownRequest),
ReadMarkdown(ReadMarkdownRequest),
DeleteMarkdown(DeleteMarkdownRequest),
GlobalizeMarkdown(GlobalizeMarkdownRequest),
Shutdown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GroundRequest {
pub query: String,
pub corpus: Option<String>,
pub top_files: Option<usize>,
pub chunks_per_file: Option<usize>,
pub limit: Option<usize>,
pub snippet_chars: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IndexRequest {
pub corpus: Option<String>,
pub paths_from: Option<PathBuf>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListFilesRequest {
pub corpus: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListTreeRequest {
pub corpus: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddMarkdownRequest {
pub corpus: String,
pub path: String,
pub content: String,
#[serde(default)]
pub overwrite: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReadMarkdownRequest {
pub corpus: String,
pub path: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeleteMarkdownRequest {
pub corpus: String,
pub path: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GlobalizeMarkdownRequest {
pub source_corpus: String,
pub path: String,
#[serde(default)]
pub dest_path: Option<String>,
#[serde(default)]
pub overwrite: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "status", rename_all = "snake_case")]
pub enum DaemonResponse {
Ok { result: serde_json::Value },
Err { kind: ErrorKind, message: String },
}
impl DaemonResponse {
pub fn ok<T: Serialize>(value: &T) -> Self {
DaemonResponse::Ok {
result: serde_json::to_value(value).unwrap_or(serde_json::Value::Null),
}
}
pub fn invalid_params(msg: impl Into<String>) -> Self {
DaemonResponse::Err {
kind: ErrorKind::InvalidParams,
message: msg.into(),
}
}
pub fn internal(msg: impl Into<String>) -> Self {
DaemonResponse::Err {
kind: ErrorKind::Internal,
message: msg.into(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ErrorKind {
InvalidParams,
Internal,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct CorpusEntry {
pub name: String,
pub paths: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GroundResult {
pub outline: String,
pub response: GroundResponse,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddMarkdownResult {
pub corpus: String,
pub path: String,
pub absolute_path: String,
pub indexed: IndexReport,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReadMarkdownResult {
pub corpus: String,
pub path: String,
pub absolute_path: String,
pub content: String,
pub bytes: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeleteMarkdownResult {
pub corpus: String,
pub path: String,
pub absolute_path: String,
pub file_ref: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GlobalizeMarkdownResult {
pub source_corpus: String,
pub source_path: String,
pub global_corpus: String,
pub dest_path: String,
pub absolute_path: String,
pub indexed: IndexReport,
}
pub type ListFilesResult = Vec<FileEntry>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListTreeResult {
pub corpus: String,
pub root: TreeNode,
}
pub type ListCorporaResult = Vec<CorpusEntry>;