use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParsedItem {
pub kind: ItemKind,
pub name: String,
pub visibility: Visibility,
pub span: Span,
pub file_path: PathBuf,
pub attributes: Vec<String>,
pub doc_comment: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ItemKind {
Function {
is_async: bool,
parameters: Vec<Parameter>,
return_type: Option<String>,
},
Struct {
fields: Vec<StructField>,
is_tuple: bool,
},
Enum {
variants: Vec<EnumVariant>,
},
Trait {
methods: Vec<String>,
supertraits: Vec<String>,
},
Impl {
self_type: String,
trait_name: Option<String>,
methods: Vec<String>,
},
Mod {
inline: bool,
},
Use {
path: String,
},
Const {
ty: String,
},
Static {
ty: String,
is_mut: bool,
},
TypeAlias {
ty: String,
},
Macro {
is_declarative: bool,
},
Unknown {
raw_text: String,
error: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Parameter {
pub name: String,
pub ty: String,
pub is_self: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct StructField {
pub name: Option<String>,
pub ty: String,
pub visibility: Visibility,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct EnumVariant {
pub name: String,
pub fields: Vec<StructField>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum Visibility {
Public,
Crate,
Super,
Private,
Restricted,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub struct Span {
pub start_line: usize,
pub start_col: usize,
pub end_line: usize,
pub end_col: usize,
}
impl Default for Span {
fn default() -> Self {
Self {
start_line: 0,
start_col: 0,
end_line: 0,
end_col: 0,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParsedFile {
pub path: PathBuf,
pub items: Vec<ParsedItem>,
pub parse_errors: Vec<ParseError>,
pub module_path: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ParseError {
pub message: String,
pub span: Option<Span>,
pub raw_text: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CrateDependency {
pub name: String,
pub version: String,
pub source: Option<String>,
pub registry_path: Option<PathBuf>,
pub public_api: Vec<ParsedItem>,
}
#[derive(Debug, Default)]
pub struct DependencyMap {
pub crates: HashMap<String, CrateDependency>,
pub registry_path: PathBuf,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkSiteScore {
pub item: ParsedItem,
pub score: f64,
pub factors: ScoreFactors,
pub context: ContextEnvelope,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ContextEnvelope {
pub breadcrumbs: String,
pub siblings: Vec<SiblingInfo>,
pub generic_bounds: Vec<GenericBound>,
pub parent_context: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SiblingInfo {
pub name: String,
pub kind: String,
pub line: usize,
pub shared_generics: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GenericBound {
pub param: String,
pub bounds: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ScoreFactors {
pub entry_distance: usize,
pub call_count: usize,
pub is_site: bool,
pub impl_count: usize,
pub trait_impls: Vec<String>,
pub cross_module_count: usize,
pub generic_depth: usize,
pub is_test: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExternalReference {
pub external_path: String,
pub file: PathBuf,
pub line: usize,
pub caller_context: String,
pub complexity: usize,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ReferenceMap {
pub references: HashMap<String, Vec<ExternalReference>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProjectAnalysis {
pub files: Vec<ParsedFile>,
pub dependencies: Vec<CrateDependency>,
pub call_graph: CallGraph,
pub module_tree: ModuleTree,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CallGraph {
pub callers: HashMap<String, Vec<CallSite>>,
pub callees: HashMap<String, Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CallSite {
pub caller: String,
pub file: PathBuf,
pub line: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ModuleTree {
pub root: ModuleNode,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ModuleNode {
pub name: String,
pub path: PathBuf,
pub children: Vec<ModuleNode>,
pub depth: usize,
}