a3s_code_core/doc/
parser.rs1use anyhow::Result;
2use std::path::Path;
3
4use super::{ExtractedDocument, ParsedDocument};
5
6pub trait DocumentParser: Send + Sync {
7 fn name(&self) -> &str;
8
9 fn signature(&self) -> String {
10 self.name().to_string()
11 }
12
13 fn supported_extensions(&self) -> &[&str];
14
15 fn parse(&self, path: &Path) -> Result<String>;
16
17 fn parse_extracted(&self, path: &Path) -> Result<ExtractedDocument> {
18 Ok(ExtractedDocument::new(ParsedDocument::from_text(
19 self.parse(path)?,
20 )))
21 }
22
23 fn can_parse(&self, path: &Path) -> bool {
24 path.extension()
25 .and_then(|e| e.to_str())
26 .map(|ext| {
27 self.supported_extensions()
28 .iter()
29 .any(|supported| supported.eq_ignore_ascii_case(ext))
30 })
31 .unwrap_or(false)
32 }
33
34 fn max_file_size(&self) -> u64 {
35 10 * 1024 * 1024
36 }
37}