use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum SymbolKind {
Function,
Method,
Class,
Struct,
Enum,
Trait,
Interface,
Module,
Type,
Constant,
Variable,
Heading,
}
impl SymbolKind {
pub fn as_str(&self) -> &'static str {
match self {
SymbolKind::Function => "function",
SymbolKind::Method => "method",
SymbolKind::Class => "class",
SymbolKind::Struct => "struct",
SymbolKind::Enum => "enum",
SymbolKind::Trait => "trait",
SymbolKind::Interface => "interface",
SymbolKind::Module => "module",
SymbolKind::Type => "type",
SymbolKind::Constant => "constant",
SymbolKind::Variable => "variable",
SymbolKind::Heading => "heading",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Visibility {
#[default]
Public,
Private,
Protected,
Internal,
}
impl Visibility {
pub fn as_str(&self) -> &'static str {
match self {
Visibility::Public => "public",
Visibility::Private => "private",
Visibility::Protected => "protected",
Visibility::Internal => "internal",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Symbol {
pub name: String,
pub kind: SymbolKind,
pub signature: String,
pub docstring: Option<String>,
pub attributes: Vec<String>,
pub start_line: usize,
pub end_line: usize,
pub visibility: Visibility,
pub children: Vec<Symbol>,
pub is_interface_impl: bool,
pub implements: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FlatSymbol {
pub name: String,
pub kind: SymbolKind,
pub start_line: usize,
pub end_line: usize,
pub parent: Option<String>,
pub visibility: Visibility,
pub attributes: Vec<String>,
pub is_interface_impl: bool,
pub implements: Vec<String>,
pub docstring: Option<String>,
}