use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ParserConfig {
pub skip_private: bool,
pub skip_tests: bool,
pub max_file_size: usize,
#[serde(with = "duration_option")]
pub timeout_per_file: Option<Duration>,
pub parallel: bool,
pub parallel_workers: Option<usize>,
pub include_docs: bool,
pub extract_types: bool,
}
mod duration_option {
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::time::Duration;
pub fn serialize<S>(duration: &Option<Duration>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match duration {
Some(d) => d.as_secs().serialize(serializer),
None => serializer.serialize_none(),
}
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Duration>, D::Error>
where
D: Deserializer<'de>,
{
let secs: Option<u64> = Option::deserialize(deserializer)?;
Ok(secs.map(Duration::from_secs))
}
}
impl Default for ParserConfig {
fn default() -> Self {
Self {
skip_private: false,
skip_tests: false,
max_file_size: 10 * 1024 * 1024, timeout_per_file: Some(Duration::from_secs(30)),
parallel: false,
parallel_workers: None,
include_docs: true,
extract_types: true,
}
}
}
impl ParserConfig {
pub fn fast() -> Self {
Self {
skip_tests: true,
include_docs: false,
extract_types: false,
..Default::default()
}
}
pub fn comprehensive() -> Self {
Self {
skip_private: false,
skip_tests: false,
include_docs: true,
extract_types: true,
..Default::default()
}
}
pub fn with_parallel(mut self, parallel: bool) -> Self {
self.parallel = parallel;
self
}
pub fn with_max_file_size(mut self, size: usize) -> Self {
self.max_file_size = size;
self
}
}