use std::sync::Arc;
use crate::context::IContext;
use crate::exceptions::TemplateEngineException;
use crate::util::{TemplateWriter, Utf16String};
use crate::{IEngineConfiguration, IThrottledTemplateProcessor, TemplateSpec};
pub type TemplateEngineResult<T> =
Result<T, Box<dyn TemplateEngineException + Send + Sync + 'static>>;
pub trait ITemplateEngine: Send + Sync {
fn get_configuration(&self) -> TemplateEngineResult<Arc<dyn IEngineConfiguration>>;
fn process(
&self,
template_spec: &TemplateSpec,
context: &dyn IContext,
) -> TemplateEngineResult<Utf16String>;
fn process_to_writer(
&self,
template_spec: &TemplateSpec,
context: &dyn IContext,
writer: Box<dyn TemplateWriter>,
) -> TemplateEngineResult<()>;
fn process_throttled(
&self,
template_spec: &TemplateSpec,
context: &dyn IContext,
) -> TemplateEngineResult<Box<dyn IThrottledTemplateProcessor>>;
fn process_template(
&self,
template: &str,
context: &dyn IContext,
) -> TemplateEngineResult<Utf16String> {
self.process(&template_spec(template, None)?, context)
}
fn process_template_with_selectors(
&self,
template: &str,
template_selectors: &crate::TemplateSelectorSet,
context: &dyn IContext,
) -> TemplateEngineResult<Utf16String> {
self.process(&template_spec(template, Some(template_selectors))?, context)
}
fn process_template_to_writer(
&self,
template: &str,
context: &dyn IContext,
writer: Box<dyn TemplateWriter>,
) -> TemplateEngineResult<()> {
self.process_to_writer(&template_spec(template, None)?, context, writer)
}
fn process_template_with_selectors_to_writer(
&self,
template: &str,
template_selectors: &crate::TemplateSelectorSet,
context: &dyn IContext,
writer: Box<dyn TemplateWriter>,
) -> TemplateEngineResult<()> {
self.process_to_writer(
&template_spec(template, Some(template_selectors))?,
context,
writer,
)
}
fn process_throttled_template(
&self,
template: &str,
context: &dyn IContext,
) -> TemplateEngineResult<Box<dyn IThrottledTemplateProcessor>> {
self.process_throttled(&template_spec(template, None)?, context)
}
fn process_throttled_template_with_selectors(
&self,
template: &str,
template_selectors: &crate::TemplateSelectorSet,
context: &dyn IContext,
) -> TemplateEngineResult<Box<dyn IThrottledTemplateProcessor>> {
self.process_throttled(&template_spec(template, Some(template_selectors))?, context)
}
}
fn template_spec(
template: &str,
selectors: Option<&crate::TemplateSelectorSet>,
) -> TemplateEngineResult<TemplateSpec> {
TemplateSpec::with_selectors_and_template_mode(Some(template), selectors, None, None).map_err(
|error| {
Box::new(crate::TemplateProcessingException::with_cause(
Some("Invalid template specification".to_owned()),
error,
)) as Box<dyn TemplateEngineException + Send + Sync>
},
)
}