use std::path::PathBuf;
use serde::{Deserialize, Serialize};
use crate::search::{SearchQuery, SymbolQuery};
pub const SOCKET_NAME: &str = "greplmd.sock";
pub fn global_socket_path() -> PathBuf {
let base = std::env::var_os("XDG_RUNTIME_DIR")
.map(PathBuf::from)
.or_else(|| std::env::var_os("TMPDIR").map(PathBuf::from))
.or_else(|| std::env::var_os("HOME").map(|h| PathBuf::from(h).join(".cache")))
.unwrap_or_else(std::env::temp_dir);
base.join("greplm").join(SOCKET_NAME)
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RoutedRequest {
pub root: PathBuf,
pub req: Request,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "op", rename_all = "snake_case")]
pub enum Request {
Ping,
Status,
Summary,
Reindex {
force: bool,
},
Search(SearchQuery),
Symbols(SymbolQuery),
Refs {
name: String,
limit: usize,
offset: usize,
},
RefsResolved {
name: String,
limit: usize,
offset: usize,
},
Callers {
name: String,
limit: usize,
offset: usize,
},
Callees {
name: String,
limit: usize,
offset: usize,
},
BlastRadius {
name: String,
depth: u32,
limit: usize,
},
Definition {
file: String,
line: u32,
col: u32,
},
ReferencesAt {
file: String,
line: u32,
col: u32,
},
Structural {
pattern: String,
lang: String,
limit: usize,
offset: usize,
},
ContextPack {
task: String,
budget: u64,
},
Blame {
file: String,
line: u32,
},
History {
name: String,
limit: usize,
},
ChangedSince {
rev: String,
},
Outline {
file: String,
},
Snippet {
file: String,
start: u32,
end: u32,
context: u32,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Response {
pub ok: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub result: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
impl Response {
pub fn ok(value: serde_json::Value) -> Self {
Response {
ok: true,
result: Some(value),
error: None,
}
}
pub fn err(message: impl Into<String>) -> Self {
Response {
ok: false,
result: None,
error: Some(message.into()),
}
}
}