fob_graph/symbol/
metadata.rs

1//! Metadata types for specialized symbol kinds.
2
3use serde::{Deserialize, Serialize};
4
5/// Visibility modifier for class members
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
7pub enum Visibility {
8    /// public (default in JS, explicit in TS)
9    Public,
10    /// private (TS or JS private fields with #)
11    Private,
12    /// protected (TS only)
13    Protected,
14}
15
16/// Additional metadata for class member symbols
17#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
18pub struct ClassMemberMetadata {
19    /// Visibility of the member
20    pub visibility: Visibility,
21    /// Whether the member is static
22    pub is_static: bool,
23    /// The class this member belongs to
24    pub class_name: String,
25    /// Whether this is an accessor (getter/setter)
26    pub is_accessor: bool,
27    /// Whether this member is abstract (TS only)
28    pub is_abstract: bool,
29    /// Whether this member is readonly (TS only)
30    pub is_readonly: bool,
31}
32
33impl ClassMemberMetadata {
34    /// Create metadata for a class member
35    pub fn new(visibility: Visibility, is_static: bool, class_name: String) -> Self {
36        Self {
37            visibility,
38            is_static,
39            class_name,
40            is_accessor: false,
41            is_abstract: false,
42            is_readonly: false,
43        }
44    }
45}
46
47/// Enum member value types
48#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
49pub enum EnumMemberValue {
50    /// Numeric value
51    Number(i64),
52    /// String value
53    String(String),
54    /// Computed value (not statically known)
55    Computed,
56}
57
58/// Metadata for enum member tracking
59#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
60pub struct EnumMemberMetadata {
61    /// The enum this member belongs to
62    pub enum_name: String,
63    /// The value of the enum member (if constant)
64    pub value: Option<EnumMemberValue>,
65}
66
67/// Code quality metrics for functions and classes
68#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
69pub struct CodeQualityMetadata {
70    /// Number of lines in the function/class (approximate)
71    pub line_count: Option<usize>,
72    /// Number of parameters (for functions)
73    pub parameter_count: Option<usize>,
74    /// Cyclomatic complexity (for functions)
75    pub complexity: Option<usize>,
76    /// Maximum nesting depth
77    pub max_nesting_depth: Option<usize>,
78    /// Number of return statements (for functions)
79    pub return_count: Option<usize>,
80    /// Number of methods (for classes)
81    pub method_count: Option<usize>,
82    /// Number of fields/properties (for classes)
83    pub field_count: Option<usize>,
84}
85
86impl CodeQualityMetadata {
87    /// Create new code quality metadata with all fields optional
88    pub fn new() -> Self {
89        Self {
90            line_count: None,
91            parameter_count: None,
92            complexity: None,
93            max_nesting_depth: None,
94            return_count: None,
95            method_count: None,
96            field_count: None,
97        }
98    }
99
100    /// Create metadata for a function
101    pub fn for_function(
102        line_count: Option<usize>,
103        parameter_count: Option<usize>,
104        complexity: Option<usize>,
105        max_nesting_depth: Option<usize>,
106        return_count: Option<usize>,
107    ) -> Self {
108        Self {
109            line_count,
110            parameter_count,
111            complexity,
112            max_nesting_depth,
113            return_count,
114            method_count: None,
115            field_count: None,
116        }
117    }
118
119    /// Create metadata for a class
120    pub fn for_class(
121        line_count: Option<usize>,
122        method_count: Option<usize>,
123        field_count: Option<usize>,
124    ) -> Self {
125        Self {
126            line_count,
127            parameter_count: None,
128            complexity: None,
129            max_nesting_depth: None,
130            return_count: None,
131            method_count,
132            field_count,
133        }
134    }
135}
136
137impl Default for CodeQualityMetadata {
138    fn default() -> Self {
139        Self::new()
140    }
141}
142
143/// Symbol metadata (extensible for different symbol kinds)
144#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
145pub enum SymbolMetadata {
146    /// No additional metadata
147    #[default]
148    None,
149    /// Class member metadata
150    ClassMember(ClassMemberMetadata),
151    /// Enum member metadata
152    EnumMember(EnumMemberMetadata),
153    /// Code quality metrics (for functions and classes)
154    CodeQuality(CodeQualityMetadata),
155}