1use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8
9#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
11pub struct TypeSignature {
12 pub parameters: Vec<ParameterInfo>,
14 pub return_type: Option<TypeInfo>,
16 pub generics: Vec<GenericParam>,
18 pub throws: Vec<String>,
20 pub is_async: bool,
22 pub is_generator: bool,
24 pub receiver: Option<String>,
26}
27
28#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
30pub struct ParameterInfo {
31 pub name: String,
33 pub type_info: Option<TypeInfo>,
35 pub is_optional: bool,
37 pub default_value: Option<String>,
39 pub is_variadic: bool,
41 pub kind: ParameterKind,
43}
44
45#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
47pub enum ParameterKind {
48 #[default]
49 Positional,
50 Keyword,
51 PositionalOrKeyword,
52 KeywordOnly,
53 VarPositional, VarKeyword, }
56
57#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
59pub struct TypeInfo {
60 pub name: String,
62 pub generic_args: Vec<TypeInfo>,
64 pub is_nullable: bool,
66 pub is_reference: bool,
68 pub is_mutable: bool,
70 pub array_dimensions: u32,
72 pub union_types: Vec<TypeInfo>,
74}
75
76#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
78pub struct GenericParam {
79 pub name: String,
81 pub constraints: Vec<String>,
83 pub default_type: Option<String>,
85 pub variance: Variance,
87}
88
89#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
91pub enum Variance {
92 #[default]
93 Invariant,
94 Covariant, Contravariant, }
97
98#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
100pub struct TypeHierarchy {
101 pub symbol_name: String,
103 pub extends: Option<String>,
105 pub implements: Vec<String>,
107 pub ancestors: Vec<AncestorInfo>,
109 pub descendants: Vec<String>,
111 pub mixins: Vec<String>,
113}
114
115#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
117pub struct AncestorInfo {
118 pub name: String,
120 pub kind: AncestorKind,
122 pub depth: u32,
124 pub file_path: Option<String>,
126}
127
128#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
130pub enum AncestorKind {
131 #[default]
132 Class,
133 Interface,
134 Trait,
135 Protocol, Mixin,
137 AbstractClass,
138}
139
140#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
142pub struct Documentation {
143 pub summary: Option<String>,
145 pub description: Option<String>,
147 pub params: Vec<ParamDoc>,
149 pub returns: Option<ReturnDoc>,
151 pub throws: Vec<ThrowsDoc>,
153 pub examples: Vec<Example>,
155 pub tags: HashMap<String, Vec<String>>,
157 pub is_deprecated: bool,
159 pub deprecation_message: Option<String>,
161 pub raw: Option<String>,
163}
164
165#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
167pub struct ParamDoc {
168 pub name: String,
170 pub type_info: Option<String>,
172 pub description: Option<String>,
174 pub is_optional: bool,
176 pub default_value: Option<String>,
178}
179
180#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
182pub struct ReturnDoc {
183 pub type_info: Option<String>,
185 pub description: Option<String>,
187}
188
189#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
191pub struct ThrowsDoc {
192 pub exception_type: String,
194 pub description: Option<String>,
196}
197
198#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
200pub struct Example {
201 pub title: Option<String>,
203 pub code: String,
205 pub language: Option<String>,
207 pub expected_output: Option<String>,
209}
210
211#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
213pub struct ComplexityMetrics {
214 pub cyclomatic: u32,
216 pub cognitive: u32,
218 pub halstead: Option<HalsteadMetrics>,
220 pub loc: LocMetrics,
222 pub maintainability_index: Option<f32>,
224 pub max_nesting_depth: u32,
226 pub parameter_count: u32,
228 pub return_count: u32,
230}
231
232#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
234pub struct HalsteadMetrics {
235 pub distinct_operators: u32,
237 pub distinct_operands: u32,
239 pub total_operators: u32,
241 pub total_operands: u32,
243 pub vocabulary: u32,
245 pub length: u32,
247 pub calculated_length: f32,
249 pub volume: f32,
251 pub difficulty: f32,
253 pub effort: f32,
255 pub time: f32,
257 pub bugs: f32,
259}
260
261#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
263pub struct LocMetrics {
264 pub total: u32,
266 pub source: u32,
268 pub comments: u32,
270 pub blank: u32,
272}
273
274#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
276pub struct DeadCodeInfo {
277 pub unused_exports: Vec<UnusedExport>,
279 pub unreachable_code: Vec<UnreachableCode>,
281 pub unused_private: Vec<UnusedSymbol>,
283 pub unused_imports: Vec<UnusedImport>,
285 pub unused_variables: Vec<UnusedVariable>,
287}
288
289#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
291pub struct UnusedExport {
292 pub name: String,
294 pub kind: String,
296 pub file_path: String,
298 pub line: u32,
300 pub confidence: f32,
302 pub reason: String,
304}
305
306#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
308pub struct UnreachableCode {
309 pub file_path: String,
311 pub start_line: u32,
313 pub end_line: u32,
315 pub snippet: String,
317 pub reason: String,
319}
320
321#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
323pub struct UnusedSymbol {
324 pub name: String,
326 pub kind: String,
328 pub file_path: String,
330 pub line: u32,
332}
333
334#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
336pub struct UnusedImport {
337 pub name: String,
339 pub import_path: String,
341 pub file_path: String,
343 pub line: u32,
345}
346
347#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
349pub struct UnusedVariable {
350 pub name: String,
352 pub file_path: String,
354 pub line: u32,
356 pub scope: Option<String>,
358}
359
360#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
362pub struct BreakingChange {
363 pub change_type: BreakingChangeType,
365 pub symbol_name: String,
367 pub symbol_kind: String,
369 pub file_path: String,
371 pub line: Option<u32>,
373 pub old_signature: Option<String>,
375 pub new_signature: Option<String>,
377 pub description: String,
379 pub severity: ChangeSeverity,
381 pub migration_hint: Option<String>,
383}
384
385#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
387pub enum BreakingChangeType {
388 Removed,
390 SignatureChanged,
392 ParameterAdded,
394 ParameterRemoved,
396 ParameterTypeChanged,
398 ReturnTypeChanged,
400 VisibilityReduced,
402 Renamed,
404 TypeConstraintChanged,
406 GenericChanged,
408 ThrowsChanged,
410 AsyncChanged,
412 Moved,
414}
415
416#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
418pub enum ChangeSeverity {
419 Critical,
421 #[default]
422 High,
424 Medium,
426 Low,
428}
429
430#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
432pub struct BreakingChangeReport {
433 pub old_ref: String,
435 pub new_ref: String,
437 pub changes: Vec<BreakingChange>,
439 pub summary: BreakingChangeSummary,
441}
442
443#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
445pub struct BreakingChangeSummary {
446 pub total: u32,
448 pub critical: u32,
450 pub high: u32,
452 pub medium: u32,
454 pub low: u32,
456 pub files_affected: u32,
458 pub symbols_affected: u32,
460}
461
462#[derive(Debug, Clone, Default, Serialize, Deserialize)]
464pub struct MultiRepoIndex {
465 pub repositories: Vec<RepoEntry>,
467 pub cross_repo_links: Vec<CrossRepoLink>,
469 pub unified_symbols: HashMap<String, Vec<UnifiedSymbolRef>>,
471}
472
473#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
475pub struct RepoEntry {
476 pub id: String,
478 pub name: String,
480 pub path: String,
482 pub commit: Option<String>,
484 pub file_count: u32,
486 pub symbol_count: u32,
488 pub indexed_at: Option<u64>,
490}
491
492#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
494pub struct CrossRepoLink {
495 pub source_repo: String,
497 pub source_file: String,
499 pub source_symbol: Option<String>,
501 pub source_line: u32,
503 pub target_repo: String,
505 pub target_symbol: String,
507 pub link_type: CrossRepoLinkType,
509}
510
511#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
513pub enum CrossRepoLinkType {
514 #[default]
515 Import,
517 TypeReference,
519 Call,
521 Extends,
523 Implements,
525}
526
527#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
529pub struct UnifiedSymbolRef {
530 pub repo_id: String,
532 pub file_path: String,
534 pub line: u32,
536 pub kind: String,
538 pub qualified_name: Option<String>,
540}