1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
5#[serde(rename_all = "snake_case")]
6pub enum SymbolKind {
7 Function,
8 Class,
9 Method,
10 Struct,
11 Interface,
12 Enum,
13 TypeAlias,
14 Variable,
16 Heading,
18 FileSummary,
20}
21
22#[derive(Debug, Clone, PartialEq, Eq)]
28pub struct Range {
29 pub start_line: u32,
30 pub start_col: u32,
31 pub end_line: u32,
32 pub end_col: u32,
33}
34
35impl serde::Serialize for Range {
36 fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
37 use serde::ser::SerializeStruct;
38 let mut s = serializer.serialize_struct("Range", 4)?;
39 s.serialize_field("start_line", &(self.start_line + 1))?;
40 s.serialize_field("start_col", &(self.start_col + 1))?;
41 s.serialize_field("end_line", &(self.end_line + 1))?;
42 s.serialize_field("end_col", &(self.end_col + 1))?;
43 s.end()
44 }
45}
46
47impl<'de> serde::Deserialize<'de> for Range {
48 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
49 #[derive(Deserialize)]
50 struct SerializedRange {
51 start_line: u32,
52 start_col: u32,
53 end_line: u32,
54 end_col: u32,
55 }
56
57 let range = SerializedRange::deserialize(deserializer)?;
58 Ok(Self {
59 start_line: range.start_line.saturating_sub(1),
60 start_col: range.start_col.saturating_sub(1),
61 end_line: range.end_line.saturating_sub(1),
62 end_col: range.end_col.saturating_sub(1),
63 })
64 }
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct Symbol {
70 pub name: String,
71 pub kind: SymbolKind,
72 pub range: Range,
73 #[serde(skip_serializing_if = "Option::is_none")]
75 pub signature: Option<String>,
76 pub scope_chain: Vec<String>,
78 pub exported: bool,
80 #[serde(skip_serializing_if = "Option::is_none")]
82 pub parent: Option<String>,
83}
84
85#[derive(Debug, Clone, Serialize)]
87pub struct SymbolMatch {
88 pub symbol: Symbol,
89 pub file: String,
90}