1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//! Wire protocol shared by the daemon and its clients.
//!
//! Messages are newline-delimited JSON over a Unix domain socket. Each request
//! is one JSON object on a line; each response is one JSON object on a line.
use serde::{Deserialize, Serialize};
use crate::search::{SearchQuery, SymbolQuery};
/// Default socket path relative to a project's `.greplm` directory.
pub const SOCKET_NAME: &str = "greplmd.sock";
/// A request from a client to the daemon.
#[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,
},
/// Resolved references (definitions + call sites + imports) from the
/// structural reference index.
RefsResolved {
name: String,
limit: usize,
offset: usize,
},
/// Call sites that target a symbol (who calls it).
Callers {
name: String,
limit: usize,
offset: usize,
},
/// Call sites inside a symbol's body (what it calls).
Callees {
name: String,
limit: usize,
offset: usize,
},
/// Symbols transitively affected by changing a symbol (reverse call graph).
BlastRadius {
name: String,
depth: u32,
limit: usize,
},
/// Typed go-to-definition for the identifier at a source position.
Definition {
file: String,
line: u32,
col: u32,
},
/// Resolved references for the identifier at a source position.
ReferencesAt {
file: String,
line: u32,
col: u32,
},
/// Structural (AST) search by tree-sitter query or meta-variable pattern.
Structural {
pattern: String,
lang: String,
limit: usize,
offset: usize,
},
/// Build a token-budgeted context pack for a task.
ContextPack {
task: String,
budget: u64,
},
/// Git blame for a single line.
Blame {
file: String,
line: u32,
},
/// Commit history of a symbol's definition.
History {
name: String,
limit: usize,
},
/// Files (with symbols) changed since a revision.
ChangedSince {
rev: String,
},
Outline {
file: String,
},
Snippet {
file: String,
start: u32,
end: u32,
context: u32,
},
}
/// A response from the daemon to a client.
#[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()),
}
}
}