Skip to main content

a3s_code_core/doc/
parser.rs

1use 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}