use crate::TemplateMode;
use crate::context::ITemplateContext;
use crate::exceptions::TemplateEngineException;
use crate::model::IProcessingInstruction;
use crate::processor::{AbstractProcessorAdapter, IProcessor};
use crate::util::ValidateError;
use super::{IProcessingInstructionProcessor, IProcessingInstructionStructureHandler};
pub struct AbstractProcessingInstructionProcessor<F> {
adapter: AbstractProcessorAdapter<F>,
}
impl<F> AbstractProcessingInstructionProcessor<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 AbstractProcessingInstructionProcessor<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> IProcessingInstructionProcessor for AbstractProcessingInstructionProcessor<F>
where
F: Fn(
&dyn ITemplateContext,
&dyn IProcessingInstruction,
&mut dyn IProcessingInstructionStructureHandler,
) -> Result<(), Box<dyn TemplateEngineException>>
+ Send
+ Sync,
{
fn process(
&self,
context: &dyn ITemplateContext,
processing_instruction: &dyn IProcessingInstruction,
structure_handler: &mut dyn IProcessingInstructionStructureHandler,
) -> Result<(), Box<dyn TemplateEngineException>> {
self.adapter.execute(processing_instruction, |callback| {
callback(context, processing_instruction, structure_handler)
})
}
}