use crate::TemplateMode;
use crate::context::ITemplateContext;
use crate::exceptions::TemplateEngineException;
use crate::model::IText;
use crate::processor::{AbstractProcessorAdapter, IProcessor};
use crate::util::ValidateError;
use super::{ITextProcessor, ITextStructureHandler};
pub struct AbstractTextProcessor<F> {
adapter: AbstractProcessorAdapter<F>,
}
impl<F> AbstractTextProcessor<F> {
pub fn new(
template_mode: Option<TemplateMode>,
precedence: i32,
processor_class_name: &'static str,
do_process: F,
) -> Result<Self, ValidateError> {
Ok(Self {
adapter: AbstractProcessorAdapter::new(
template_mode,
precedence,
processor_class_name,
do_process,
)?,
})
}
}
impl<F> IProcessor for AbstractTextProcessor<F>
where
F: Send + Sync,
{
fn class_name(&self) -> &'static str {
self.adapter.processor_class_name()
}
fn get_template_mode(&self) -> Option<TemplateMode> {
self.adapter.template_mode()
}
fn get_precedence(&self) -> i32 {
self.adapter.precedence()
}
}
impl<F> ITextProcessor for AbstractTextProcessor<F>
where
F: Fn(
&dyn ITemplateContext,
&dyn IText,
&mut dyn ITextStructureHandler,
) -> Result<(), Box<dyn TemplateEngineException>>
+ Send
+ Sync,
{
fn process(
&self,
context: &dyn ITemplateContext,
text: &dyn IText,
structure_handler: &mut dyn ITextStructureHandler,
) -> Result<(), Box<dyn TemplateEngineException>> {
self.adapter
.execute(text, |callback| callback(context, text, structure_handler))
}
}