use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReachabilityResult {
pub symbol: SymbolInfo,
pub direction: String, pub max_depth: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub forward: Option<ReachabilityChain>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reverse: Option<ReachabilityChain>,
pub affected_files: Vec<AffectedFile>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReachabilityChain {
pub count: usize,
pub depth: usize,
pub symbols: Vec<ReachableSymbol>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReachableSymbol {
pub symbol: SymbolInfo,
pub depth: usize,
pub path: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AffectedFile {
pub path: String,
pub symbol_count: usize,
pub is_root: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeadCodeResult {
pub entry_point: SymbolInfo,
pub total_symbols: usize,
pub reachable_count: usize,
pub dead_count: usize,
pub dead_by_file: Vec<DeadCodeByFile>,
pub excluded_public: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeadCodeByFile {
pub path: String,
pub count: usize,
pub symbols: Vec<DeadSymbol>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeadSymbol {
pub symbol: SymbolInfo,
pub reason: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CycleDetectionResult {
pub total_cycles: usize,
pub max_cycles: usize,
pub truncated: bool,
pub cycles: Vec<CycleInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub queried_symbol: Option<SymbolInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CycleInfo {
pub id: String,
pub size: usize,
pub members: Vec<SymbolInfo>,
pub representative: SymbolInfo,
pub is_self_loop: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SymbolInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub symbol_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_format: Option<String>,
pub name: String,
pub kind: String,
pub file_path: String,
pub byte_start: usize,
pub byte_end: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CondensationResult {
pub scc_count: usize,
pub cycle_scc_count: usize,
pub singleton_count: usize,
pub sccs: Vec<CondensedScc>,
pub edges: Vec<SccEdge>,
#[serde(skip_serializing_if = "Option::is_none")]
pub levels: Option<Vec<LevelInfo>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CondensedScc {
pub id: String,
pub size: usize,
pub is_cycle: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub members: Option<Vec<SymbolInfo>>,
pub representative: SymbolInfo,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SccEdge {
pub from: String,
pub to: String,
pub weight: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LevelInfo {
pub level: usize,
pub scc_ids: Vec<String>,
pub count: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SliceResult {
pub target: SymbolInfo,
pub direction: String, pub max_depth: Option<usize>,
pub symbols: Vec<SlicedSymbol>,
pub affected_files: Vec<AffectedFile>,
pub stats: SliceStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SlicedSymbol {
pub symbol: SymbolInfo,
pub distance: usize,
pub is_target: bool,
pub relationship: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SliceStats {
pub total_symbols: usize,
pub max_distance: usize,
pub affected_file_count: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExportResponse {
pub schema_version: String,
pub timestamp: String,
pub db_path: String,
pub data: ExportData,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExportData {
pub files: Vec<FileExport>,
pub symbols: Vec<SymbolExport>,
pub references: Vec<ReferenceExport>,
pub calls: Vec<CallExport>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileExport {
pub path: String,
pub hash: String,
pub last_indexed_at: i64,
pub last_modified: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SymbolExport {
pub symbol_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_format: Option<String>,
pub name: String,
pub kind: String,
pub file_path: String,
pub byte_start: usize,
pub byte_end: usize,
pub start_line: usize,
pub end_line: usize,
pub start_col: usize,
pub end_col: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReferenceExport {
pub from_symbol_id: String,
pub to_symbol_id: String,
pub reference_kind: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CallExport {
pub caller_symbol_id: String,
pub callee_symbol_id: String,
pub call_site_file: String,
pub call_site_line: usize,
}
pub const EXPORT_SCHEMA_VERSION: &str = "1.0.0";