1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Serialize, Deserialize)]
4pub struct LocationInfo {
5 pub path: String,
6 pub line: u32,
7 #[serde(default)]
8 pub column: u32,
9 #[serde(skip_serializing_if = "Option::is_none")]
10 pub context_lines: Option<Vec<String>>,
11 #[serde(skip_serializing_if = "Option::is_none")]
12 pub context_start: Option<u32>,
13 #[serde(skip_serializing_if = "Option::is_none")]
14 pub name: Option<String>,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub kind: Option<String>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub detail: Option<String>,
19}
20
21impl LocationInfo {
22 pub fn new(path: String, line: u32) -> Self {
23 Self {
24 path,
25 line,
26 column: 0,
27 context_lines: None,
28 context_start: None,
29 name: None,
30 kind: None,
31 detail: None,
32 }
33 }
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct FileInfo {
38 pub path: String,
39 pub lines: u32,
40 pub bytes: u64,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct CacheInfo {
45 pub current_bytes: u64,
46 pub max_bytes: u64,
47 pub entries: u64,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
51pub struct WorkspaceInfo {
52 pub root: String,
53 pub language: String,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 pub server_pid: Option<u32>,
56 pub open_documents: Vec<String>,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
60pub struct CallNode {
61 pub name: String,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub kind: Option<String>,
64 #[serde(skip_serializing_if = "Option::is_none")]
65 pub detail: Option<String>,
66 #[serde(skip_serializing_if = "Option::is_none")]
67 pub path: Option<String>,
68 #[serde(skip_serializing_if = "Option::is_none")]
69 pub line: Option<u32>,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub column: Option<u32>,
72 #[serde(default)]
73 pub in_workspace: bool,
74 #[serde(skip_serializing_if = "Option::is_none")]
75 pub calls: Option<Vec<CallNode>>,
76 #[serde(skip_serializing_if = "Option::is_none")]
77 pub called_by: Option<Vec<CallNode>>,
78}
79
80impl CallNode {
81 pub fn new(name: String) -> Self {
82 Self {
83 name,
84 kind: None,
85 detail: None,
86 path: None,
87 line: None,
88 column: None,
89 in_workspace: true,
90 calls: None,
91 called_by: None,
92 }
93 }
94}
95
96#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
97pub struct CallGraphSymbol {
98 pub name: String,
99 pub kind: String,
100 pub path: String,
101 pub line: u32,
102 pub column: u32,
103 #[serde(skip_serializing_if = "Option::is_none")]
104 pub detail: Option<String>,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
108pub struct CallGraphEdge {
109 pub caller: CallGraphSymbol,
110 pub callee: CallGraphSymbol,
111 pub in_workspace: bool,
112 #[serde(default, skip_serializing_if = "Option::is_none")]
113 pub call_site_line: Option<u32>,
114}
115
116#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct CallGraphFileEdges {
118 pub edges: Vec<CallGraphEdge>,
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize)]
122pub struct GraphResult {
123 pub nodes: Vec<CallGraphSymbol>,
124 pub edges: Vec<CallGraphEdge>,
125 pub indexing_time_ms: Option<u64>,
126 #[serde(skip_serializing_if = "Option::is_none")]
127 pub error: Option<String>,
128}