1use std::path::PathBuf;
7
8use serde::{Deserialize, Serialize};
9
10use crate::search::{SearchQuery, SymbolQuery};
11
12pub const SOCKET_NAME: &str = "greplmd.sock";
14
15pub fn global_socket_path() -> PathBuf {
23 let base = std::env::var_os("XDG_RUNTIME_DIR")
24 .map(PathBuf::from)
25 .or_else(|| std::env::var_os("TMPDIR").map(PathBuf::from))
26 .or_else(|| std::env::var_os("HOME").map(|h| PathBuf::from(h).join(".cache")))
27 .unwrap_or_else(std::env::temp_dir);
28 base.join("greplm").join(SOCKET_NAME)
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct RoutedRequest {
36 pub root: PathBuf,
37 pub req: Request,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
42#[serde(tag = "op", rename_all = "snake_case")]
43pub enum Request {
44 Ping,
45 Status,
46 Summary,
47 Reindex {
48 force: bool,
49 },
50 Search(SearchQuery),
51 Symbols(SymbolQuery),
52 Refs {
53 name: String,
54 limit: usize,
55 offset: usize,
56 },
57 RefsResolved {
60 name: String,
61 limit: usize,
62 offset: usize,
63 },
64 Callers {
66 name: String,
67 limit: usize,
68 offset: usize,
69 },
70 Callees {
72 name: String,
73 limit: usize,
74 offset: usize,
75 },
76 BlastRadius {
78 name: String,
79 depth: u32,
80 limit: usize,
81 },
82 Definition {
84 file: String,
85 line: u32,
86 col: u32,
87 },
88 ReferencesAt {
90 file: String,
91 line: u32,
92 col: u32,
93 },
94 Structural {
96 pattern: String,
97 lang: String,
98 limit: usize,
99 offset: usize,
100 },
101 ContextPack {
103 task: String,
104 budget: u64,
105 },
106 Blame {
108 file: String,
109 line: u32,
110 },
111 History {
113 name: String,
114 limit: usize,
115 },
116 ChangedSince {
118 rev: String,
119 },
120 Outline {
121 file: String,
122 },
123 Snippet {
124 file: String,
125 start: u32,
126 end: u32,
127 context: u32,
128 },
129}
130
131#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct Response {
134 pub ok: bool,
135 #[serde(skip_serializing_if = "Option::is_none")]
136 pub result: Option<serde_json::Value>,
137 #[serde(skip_serializing_if = "Option::is_none")]
138 pub error: Option<String>,
139}
140
141impl Response {
142 pub fn ok(value: serde_json::Value) -> Self {
143 Response {
144 ok: true,
145 result: Some(value),
146 error: None,
147 }
148 }
149
150 pub fn err(message: impl Into<String>) -> Self {
151 Response {
152 ok: false,
153 result: None,
154 error: Some(message.into()),
155 }
156 }
157}