use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct TypeSignature {
pub parameters: Vec<ParameterInfo>,
pub return_type: Option<TypeInfo>,
pub generics: Vec<GenericParam>,
pub throws: Vec<String>,
pub is_async: bool,
pub is_generator: bool,
pub receiver: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ParameterInfo {
pub name: String,
pub type_info: Option<TypeInfo>,
pub is_optional: bool,
pub default_value: Option<String>,
pub is_variadic: bool,
pub kind: ParameterKind,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub enum ParameterKind {
#[default]
Positional,
Keyword,
PositionalOrKeyword,
KeywordOnly,
VarPositional, VarKeyword, }
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct TypeInfo {
pub name: String,
pub generic_args: Vec<TypeInfo>,
pub is_nullable: bool,
pub is_reference: bool,
pub is_mutable: bool,
pub array_dimensions: u32,
pub union_types: Vec<TypeInfo>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct GenericParam {
pub name: String,
pub constraints: Vec<String>,
pub default_type: Option<String>,
pub variance: Variance,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub enum Variance {
#[default]
Invariant,
Covariant, Contravariant, }
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct TypeHierarchy {
pub symbol_name: String,
pub extends: Option<String>,
pub implements: Vec<String>,
pub ancestors: Vec<AncestorInfo>,
pub descendants: Vec<String>,
pub mixins: Vec<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct AncestorInfo {
pub name: String,
pub kind: AncestorKind,
pub depth: u32,
pub file_path: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub enum AncestorKind {
#[default]
Class,
Interface,
Trait,
Protocol, Mixin,
AbstractClass,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct Documentation {
pub summary: Option<String>,
pub description: Option<String>,
pub params: Vec<ParamDoc>,
pub returns: Option<ReturnDoc>,
pub throws: Vec<ThrowsDoc>,
pub examples: Vec<Example>,
pub tags: HashMap<String, Vec<String>>,
pub is_deprecated: bool,
pub deprecation_message: Option<String>,
pub raw: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ParamDoc {
pub name: String,
pub type_info: Option<String>,
pub description: Option<String>,
pub is_optional: bool,
pub default_value: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ReturnDoc {
pub type_info: Option<String>,
pub description: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ThrowsDoc {
pub exception_type: String,
pub description: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct Example {
pub title: Option<String>,
pub code: String,
pub language: Option<String>,
pub expected_output: Option<String>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ComplexityMetrics {
pub cyclomatic: u32,
pub cognitive: u32,
pub halstead: Option<HalsteadMetrics>,
pub loc: LocMetrics,
pub maintainability_index: Option<f32>,
pub max_nesting_depth: u32,
pub parameter_count: u32,
pub return_count: u32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct HalsteadMetrics {
pub distinct_operators: u32,
pub distinct_operands: u32,
pub total_operators: u32,
pub total_operands: u32,
pub vocabulary: u32,
pub length: u32,
pub calculated_length: f32,
pub volume: f32,
pub difficulty: f32,
pub effort: f32,
pub time: f32,
pub bugs: f32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct LocMetrics {
pub total: u32,
pub source: u32,
pub comments: u32,
pub blank: u32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct DeadCodeInfo {
pub unused_exports: Vec<UnusedExport>,
pub unreachable_code: Vec<UnreachableCode>,
pub unused_private: Vec<UnusedSymbol>,
pub unused_imports: Vec<UnusedImport>,
pub unused_variables: Vec<UnusedVariable>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct UnusedExport {
pub name: String,
pub kind: String,
pub file_path: String,
pub line: u32,
pub confidence: f32,
pub reason: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct UnreachableCode {
pub file_path: String,
pub start_line: u32,
pub end_line: u32,
pub snippet: String,
pub reason: String,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct UnusedSymbol {
pub name: String,
pub kind: String,
pub file_path: String,
pub line: u32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct UnusedImport {
pub name: String,
pub import_path: String,
pub file_path: String,
pub line: u32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct UnusedVariable {
pub name: String,
pub file_path: String,
pub line: u32,
pub scope: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BreakingChange {
pub change_type: BreakingChangeType,
pub symbol_name: String,
pub symbol_kind: String,
pub file_path: String,
pub line: Option<u32>,
pub old_signature: Option<String>,
pub new_signature: Option<String>,
pub description: String,
pub severity: ChangeSeverity,
pub migration_hint: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum BreakingChangeType {
Removed,
SignatureChanged,
ParameterAdded,
ParameterRemoved,
ParameterTypeChanged,
ReturnTypeChanged,
VisibilityReduced,
Renamed,
TypeConstraintChanged,
GenericChanged,
ThrowsChanged,
AsyncChanged,
Moved,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub enum ChangeSeverity {
Critical,
#[default]
High,
Medium,
Low,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct BreakingChangeReport {
pub old_ref: String,
pub new_ref: String,
pub changes: Vec<BreakingChange>,
pub summary: BreakingChangeSummary,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct BreakingChangeSummary {
pub total: u32,
pub critical: u32,
pub high: u32,
pub medium: u32,
pub low: u32,
pub files_affected: u32,
pub symbols_affected: u32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct MultiRepoIndex {
pub repositories: Vec<RepoEntry>,
pub cross_repo_links: Vec<CrossRepoLink>,
pub unified_symbols: HashMap<String, Vec<UnifiedSymbolRef>>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct RepoEntry {
pub id: String,
pub name: String,
pub path: String,
pub commit: Option<String>,
pub file_count: u32,
pub symbol_count: u32,
pub indexed_at: Option<u64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct CrossRepoLink {
pub source_repo: String,
pub source_file: String,
pub source_symbol: Option<String>,
pub source_line: u32,
pub target_repo: String,
pub target_symbol: String,
pub link_type: CrossRepoLinkType,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub enum CrossRepoLinkType {
#[default]
Import,
TypeReference,
Call,
Extends,
Implements,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct UnifiedSymbolRef {
pub repo_id: String,
pub file_path: String,
pub line: u32,
pub kind: String,
pub qualified_name: Option<String>,
}