codegraph_parser_api/
config.rs

1use serde::{Deserialize, Serialize};
2use std::time::Duration;
3
4/// Configuration for parser behavior
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
6pub struct ParserConfig {
7    /// Skip private/internal entities (language-specific)
8    pub skip_private: bool,
9
10    /// Skip test files and test functions
11    pub skip_tests: bool,
12
13    /// Maximum file size to parse (in bytes)
14    /// Files larger than this will be skipped
15    pub max_file_size: usize,
16
17    /// Timeout per file (None = no timeout)
18    #[serde(with = "duration_option")]
19    pub timeout_per_file: Option<Duration>,
20
21    /// Enable parallel parsing (for `parse_files`)
22    pub parallel: bool,
23
24    /// Number of parallel workers (None = use num_cpus)
25    pub parallel_workers: Option<usize>,
26
27    /// Include documentation/comments in entities
28    pub include_docs: bool,
29
30    /// Extract type information (when available)
31    pub extract_types: bool,
32}
33
34// Helper module for serializing Duration
35mod duration_option {
36    use serde::{Deserialize, Deserializer, Serialize, Serializer};
37    use std::time::Duration;
38
39    pub fn serialize<S>(duration: &Option<Duration>, serializer: S) -> Result<S::Ok, S::Error>
40    where
41        S: Serializer,
42    {
43        match duration {
44            Some(d) => d.as_secs().serialize(serializer),
45            None => serializer.serialize_none(),
46        }
47    }
48
49    pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Duration>, D::Error>
50    where
51        D: Deserializer<'de>,
52    {
53        let secs: Option<u64> = Option::deserialize(deserializer)?;
54        Ok(secs.map(Duration::from_secs))
55    }
56}
57
58impl Default for ParserConfig {
59    fn default() -> Self {
60        Self {
61            skip_private: false,
62            skip_tests: false,
63            max_file_size: 10 * 1024 * 1024, // 10 MB
64            timeout_per_file: Some(Duration::from_secs(30)),
65            parallel: false,
66            parallel_workers: None,
67            include_docs: true,
68            extract_types: true,
69        }
70    }
71}
72
73impl ParserConfig {
74    /// Create config for fast parsing (skips tests, docs, types)
75    pub fn fast() -> Self {
76        Self {
77            skip_tests: true,
78            include_docs: false,
79            extract_types: false,
80            ..Default::default()
81        }
82    }
83
84    /// Create config for comprehensive parsing
85    pub fn comprehensive() -> Self {
86        Self {
87            skip_private: false,
88            skip_tests: false,
89            include_docs: true,
90            extract_types: true,
91            ..Default::default()
92        }
93    }
94
95    /// Enable parallel parsing
96    pub fn with_parallel(mut self, parallel: bool) -> Self {
97        self.parallel = parallel;
98        self
99    }
100
101    /// Set maximum file size
102    pub fn with_max_file_size(mut self, size: usize) -> Self {
103        self.max_file_size = size;
104        self
105    }
106}