rsnip/infrastructure/parsers/
mod.rs

1mod default;
2mod scls;
3mod vcode;
4
5pub use default::DefaultSnippetParser;
6pub use scls::SclsSnippetParser;
7pub use vcode::VCodeSnippetParser;
8
9use crate::domain::parser::{SnippetFormat, SnippetParser};
10use std::sync::Arc;
11use tracing::instrument;
12
13/// Factory for creating appropriate parser instances
14pub struct SnippetParserFactory;
15
16impl SnippetParserFactory {
17    #[instrument(level = "debug")]
18    pub fn create(format: SnippetFormat) -> Arc<dyn SnippetParser> {
19        match format {
20            SnippetFormat::Default => Arc::new(DefaultSnippetParser::new()),
21            SnippetFormat::Scls => Arc::new(SclsSnippetParser::new()),
22            SnippetFormat::VCode => Arc::new(VCodeSnippetParser::new()),
23        }
24    }
25}
26
27#[cfg(test)]
28mod tests {
29    use super::*;
30    use anyhow::Result;
31    use std::io::Write;
32    use std::path::PathBuf;
33    use tempfile::NamedTempFile;
34
35    #[test]
36    fn given_format_when_creating_parser_then_returns_correct_implementation() {
37        let default_parser = SnippetParserFactory::create(SnippetFormat::Default);
38        let scls_parser = SnippetParserFactory::create(SnippetFormat::Scls);
39
40        // Type checking is enough here as the concrete types are private
41        assert!(default_parser.parse(&PathBuf::from("dummy")).is_err());
42        assert!(scls_parser.parse(&PathBuf::from("dummy")).is_err());
43    }
44
45    #[test]
46    fn given_default_format_file_when_parsing_then_succeeds() -> Result<()> {
47        let mut file = NamedTempFile::new()?;
48        writeln!(file, "--- test\ncontent\n---")?;
49
50        let parser = SnippetParserFactory::create(SnippetFormat::Default);
51        let snippets = parser.parse(file.path())?;
52
53        assert_eq!(snippets.len(), 1);
54        assert_eq!(snippets[0].name, "test");
55        Ok(())
56    }
57
58    #[test]
59    fn given_scls_format_file_when_parsing_then_succeeds() -> Result<()> {
60        let mut file = NamedTempFile::new()?;
61        writeln!(
62            file,
63            r#"
64            [[snippets]]
65            prefix = "test"
66            body = "content"
67        "#
68        )?;
69
70        let parser = SnippetParserFactory::create(SnippetFormat::Scls);
71        let snippets = parser.parse(file.path())?;
72
73        assert_eq!(snippets.len(), 1);
74        assert_eq!(snippets[0].name, "test");
75        Ok(())
76    }
77}