rsnip/infrastructure/parsers/
mod.rs1mod 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
13pub 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 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}