use crate::domain::Result;
use std::collections::HashMap;
pub trait ConfigParser {
fn parse(&self, content: &str) -> Result<HashMap<String, String>>;
fn supported_extensions(&self) -> &[&str];
}
#[cfg(test)]
mod tests {
use super::*;
struct TestParser;
impl ConfigParser for TestParser {
fn parse(&self, _content: &str) -> Result<HashMap<String, String>> {
let mut map = HashMap::new();
map.insert("test.key".to_string(), "test.value".to_string());
Ok(map)
}
fn supported_extensions(&self) -> &[&str] {
&["test", "tst"]
}
}
#[test]
fn test_parser_parse() {
let parser = TestParser;
let result = parser.parse("dummy content").unwrap();
assert_eq!(result.len(), 1);
assert_eq!(result.get("test.key"), Some(&"test.value".to_string()));
}
#[test]
fn test_parser_supported_extensions() {
let parser = TestParser;
let extensions = parser.supported_extensions();
assert_eq!(extensions.len(), 2);
assert_eq!(extensions[0], "test");
assert_eq!(extensions[1], "tst");
}
#[test]
fn test_parser_parse_empty_content() {
let parser = TestParser;
let result = parser.parse("").unwrap();
assert_eq!(result.len(), 1);
}
struct FlatteningParser;
impl ConfigParser for FlatteningParser {
fn parse(&self, _content: &str) -> Result<HashMap<String, String>> {
let mut map = HashMap::new();
map.insert("database.host".to_string(), "localhost".to_string());
map.insert("database.port".to_string(), "5432".to_string());
map.insert("app.name".to_string(), "MyApp".to_string());
Ok(map)
}
fn supported_extensions(&self) -> &[&str] {
&["flat"]
}
}
#[test]
fn test_flattening_parser() {
let parser = FlatteningParser;
let result = parser.parse("").unwrap();
assert_eq!(result.len(), 3);
assert_eq!(result.get("database.host"), Some(&"localhost".to_string()));
assert_eq!(result.get("database.port"), Some(&"5432".to_string()));
assert_eq!(result.get("app.name"), Some(&"MyApp".to_string()));
}
}