use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
pub type MetadataMap = HashMap<String, serde_json::Value>;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Annotation {
pub kind: String,
pub text: String,
pub line: u32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FileInfo {
pub path: String,
pub filename: String,
pub loc: u32,
pub module_path: String,
pub language: String,
pub submodule_declarations: Vec<String>,
pub imports: Vec<String>,
pub exports: Vec<String>,
pub annotations: Option<Vec<Annotation>>,
pub is_test: bool,
pub skip_reason: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct FunctionInfo {
pub name: String,
pub qualified_name: String,
pub visibility: String,
pub is_async: bool,
pub is_method: bool,
pub signature: String,
pub file_path: String,
pub line_number: u32,
pub docstring: Option<String>,
pub return_type: Option<String>,
pub decorators: Vec<String>,
pub calls: Vec<(String, u32)>,
pub references: Vec<(String, u32)>,
pub function_refs: Vec<(String, u32)>,
pub type_parameters: Option<String>,
pub end_line: Option<u32>,
pub parameters: Vec<ParameterInfo>,
pub branch_count: Option<u32>,
pub param_count: Option<u32>,
pub max_nesting: Option<u32>,
pub is_recursive: Option<bool>,
pub procedure_names: Vec<String>,
pub metadata: MetadataMap,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ParameterInfo {
pub name: String,
pub type_annotation: Option<String>,
pub default: Option<String>,
pub kind: ParameterKind,
}
#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ParameterKind {
#[default]
Positional,
Variadic,
KwVariadic,
Receiver,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ClassInfo {
pub name: String,
pub qualified_name: String,
pub kind: String,
pub visibility: String,
pub file_path: String,
pub line_number: u32,
pub docstring: Option<String>,
pub bases: Vec<String>,
pub type_parameters: Option<String>,
pub end_line: Option<u32>,
pub metadata: MetadataMap,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct EnumInfo {
pub name: String,
pub qualified_name: String,
pub visibility: String,
pub file_path: String,
pub line_number: u32,
pub docstring: Option<String>,
pub variants: Vec<String>,
pub end_line: Option<u32>,
pub variant_details: Option<Vec<serde_json::Value>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct InterfaceInfo {
pub name: String,
pub qualified_name: String,
pub kind: String,
pub visibility: String,
pub file_path: String,
pub line_number: u32,
pub docstring: Option<String>,
pub type_parameters: Option<String>,
pub end_line: Option<u32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct AttributeInfo {
pub name: String,
pub qualified_name: String,
pub owner_qualified_name: String,
pub type_annotation: Option<String>,
pub visibility: String,
pub file_path: String,
pub line_number: u32,
pub default_value: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ConstantInfo {
pub name: String,
pub qualified_name: String,
pub kind: String,
pub type_annotation: Option<String>,
pub value_preview: Option<String>,
pub visibility: String,
pub file_path: String,
pub line_number: u32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ElementInfo {
pub name: String,
pub qualified_name: String,
pub tag: String,
pub kind: String,
pub id: Option<String>,
pub action: Option<String>,
pub method: Option<String>,
pub file_path: String,
pub line_number: u32,
pub end_line: Option<u32>,
pub parent_qname: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SelectorInfo {
pub name: String,
pub qualified_name: String,
pub kind: String,
pub file_path: String,
pub line_number: u32,
pub end_line: Option<u32>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TypeRelationship {
pub source_type: String,
pub target_type: Option<String>,
pub relationship: String,
pub methods: Vec<FunctionInfo>,
}
#[derive(Debug, Clone, Default)]
pub struct ParseResult {
pub files: Vec<FileInfo>,
pub functions: Vec<FunctionInfo>,
pub classes: Vec<ClassInfo>,
pub enums: Vec<EnumInfo>,
pub interfaces: Vec<InterfaceInfo>,
pub type_relationships: Vec<TypeRelationship>,
pub attributes: Vec<AttributeInfo>,
pub constants: Vec<ConstantInfo>,
pub elements: Vec<ElementInfo>,
pub selectors: Vec<SelectorInfo>,
}
impl ParseResult {
pub fn new() -> Self {
Self::default()
}
pub fn merge(&mut self, mut other: ParseResult) {
self.files.append(&mut other.files);
self.functions.append(&mut other.functions);
self.classes.append(&mut other.classes);
self.enums.append(&mut other.enums);
self.interfaces.append(&mut other.interfaces);
self.type_relationships
.append(&mut other.type_relationships);
self.attributes.append(&mut other.attributes);
self.constants.append(&mut other.constants);
self.elements.append(&mut other.elements);
self.selectors.append(&mut other.selectors);
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SourceRoot {
pub path: PathBuf,
pub language: Option<String>,
pub is_test: bool,
pub label: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DependencyInfo {
pub name: String,
pub version_spec: Option<String>,
pub is_dev: bool,
pub is_optional: bool,
pub group: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ProjectInfo {
pub name: String,
pub version: Option<String>,
pub description: Option<String>,
pub languages: Vec<String>,
pub authors: Vec<String>,
pub license: Option<String>,
pub repository_url: Option<String>,
pub manifest_path: String,
pub source_roots: Vec<SourceRoot>,
pub test_roots: Vec<SourceRoot>,
pub dependencies: Vec<DependencyInfo>,
pub build_system: Option<String>,
pub metadata: MetadataMap,
}
#[derive(Debug, Clone, Serialize)]
pub struct FieldEntry {
pub name: String,
#[serde(rename = "type")]
pub r#type: Option<String>,
pub visibility: String,
pub default: Option<String>,
}