use std::cell::RefCell;
use std::rc::Rc;
use std::sync::Arc;
use crate::context::ITemplateContext;
use crate::exceptions::TemplateEngineException;
use crate::model::{
ICDATASection, ICloseElementTag, IComment, IDocType, IOpenElementTag, IProcessingInstruction,
IStandaloneElementTag, ITemplateEnd, ITemplateStart, IText, IXMLDeclaration,
};
use super::gathering_model_execution_state::GatheringModelExecutionState;
pub trait ITemplateHandler {
fn create_reentrant_handler(&self) -> Option<Box<dyn ITemplateHandler>> {
None
}
fn set_next(&mut self, next: Option<TemplateHandlerHandle>);
fn set_context(&mut self, context: Arc<dyn ITemplateContext>);
fn set_current_gathering_model(&mut self, _state: Option<GatheringModelExecutionState>) {}
fn handle_template_start(
&mut self,
template_start: Arc<dyn ITemplateStart>,
) -> Result<(), Box<dyn TemplateEngineException>>;
fn handle_template_end(
&mut self,
template_end: Arc<dyn ITemplateEnd>,
) -> Result<(), Box<dyn TemplateEngineException>>;
fn handle_xml_declaration(
&mut self,
xml_declaration: Arc<dyn IXMLDeclaration>,
) -> Result<(), Box<dyn TemplateEngineException>>;
fn handle_doc_type(
&mut self,
doc_type: Arc<dyn IDocType>,
) -> Result<(), Box<dyn TemplateEngineException>>;
fn handle_cdata_section(
&mut self,
cdata_section: Arc<dyn ICDATASection>,
) -> Result<(), Box<dyn TemplateEngineException>>;
fn handle_comment(
&mut self,
comment: Arc<dyn IComment>,
) -> Result<(), Box<dyn TemplateEngineException>>;
fn handle_text(&mut self, text: Arc<dyn IText>)
-> Result<(), Box<dyn TemplateEngineException>>;
fn handle_standalone_element(
&mut self,
tag: Arc<dyn IStandaloneElementTag>,
) -> Result<(), Box<dyn TemplateEngineException>>;
fn handle_open_element(
&mut self,
tag: Arc<dyn IOpenElementTag>,
) -> Result<(), Box<dyn TemplateEngineException>>;
fn handle_close_element(
&mut self,
tag: Arc<dyn ICloseElementTag>,
) -> Result<(), Box<dyn TemplateEngineException>>;
fn handle_processing_instruction(
&mut self,
instruction: Arc<dyn IProcessingInstruction>,
) -> Result<(), Box<dyn TemplateEngineException>>;
}
pub type TemplateHandlerHandle = Rc<RefCell<Box<dyn ITemplateHandler>>>;