use crate::cache::TemplateConfigurationFactory;
use crate::cache::TemplateConfigurationFactoryException;
use crate::core::TemplateConfiguration;
use std::sync::Arc;
pub struct MergingTemplateConfigurationFactory {
factories: Vec<Box<dyn TemplateConfigurationFactory>>,
}
impl MergingTemplateConfigurationFactory {
pub fn new(factories: Vec<Box<dyn TemplateConfigurationFactory>>) -> Self {
MergingTemplateConfigurationFactory { factories }
}
}
impl TemplateConfigurationFactory for MergingTemplateConfigurationFactory {
fn get(
&self,
source_name: &str,
) -> Result<Option<Arc<TemplateConfiguration>>, TemplateConfigurationFactoryException> {
let mut merged: Option<Arc<TemplateConfiguration>> = None;
for f in &self.factories {
if let Some(tc) = f.get(source_name)? {
match &merged {
None => merged = Some(tc),
Some(m) => {
let mut m2 = (**m).clone();
m2.merge(&tc);
merged = Some(Arc::new(m2));
}
}
}
}
Ok(merged)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::cache::ConditionalTemplateConfigurationFactory;
use crate::cache::FileExtensionMatcher;
#[allow(clippy::field_reassign_with_default)]
#[test]
fn merging_combines_settings() {
let mut tc1 = TemplateConfiguration::default();
tc1.number_format = Some("0.00".to_string());
let mut tc2 = TemplateConfiguration::default();
tc2.locale = Some("de_DE".to_string());
let m = MergingTemplateConfigurationFactory::new(vec![
Box::new(ConditionalTemplateConfigurationFactory::with_configuration(
Box::new(FileExtensionMatcher::new("ftl")),
Arc::new(tc1),
)),
Box::new(ConditionalTemplateConfigurationFactory::with_configuration(
Box::new(FileExtensionMatcher::new("ftl")),
Arc::new(tc2),
)),
]);
let out = m.get("a.ftl").unwrap().expect("命中");
assert_eq!(out.number_format.as_deref(), Some("0.00"));
assert_eq!(out.locale.as_deref(), Some("de_DE"));
assert!(m.get("a.txt").unwrap().is_none());
}
}