use serde::Serialize;
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum SymbolKind {
Function,
Class,
Method,
Struct,
Interface,
Enum,
TypeAlias,
Variable,
Heading,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Range {
pub start_line: u32,
pub start_col: u32,
pub end_line: u32,
pub end_col: u32,
}
impl serde::Serialize for Range {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
use serde::ser::SerializeStruct;
let mut s = serializer.serialize_struct("Range", 4)?;
s.serialize_field("start_line", &(self.start_line + 1))?;
s.serialize_field("start_col", &(self.start_col + 1))?;
s.serialize_field("end_line", &(self.end_line + 1))?;
s.serialize_field("end_col", &(self.end_col + 1))?;
s.end()
}
}
#[derive(Debug, Clone, Serialize)]
pub struct Symbol {
pub name: String,
pub kind: SymbolKind,
pub range: Range,
#[serde(skip_serializing_if = "Option::is_none")]
pub signature: Option<String>,
pub scope_chain: Vec<String>,
pub exported: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub parent: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct SymbolMatch {
pub symbol: Symbol,
pub file: String,
}