use std::sync::Arc;
use indexmap::IndexMap;
use crate::engine::TemplateData;
use crate::expression::TemplateValue;
use crate::inline::IInliner;
use crate::model::IProcessableElementTag;
use crate::util::Utf16String;
use super::ITemplateContext;
pub trait IEngineContext: ITemplateContext {
fn set_variable(&self, name: Option<Utf16String>, value: Option<Arc<TemplateValue>>);
fn set_variables(&self, variables: &IndexMap<Option<Utf16String>, Option<Arc<TemplateValue>>>);
fn remove_variable(&self, name: Option<&Utf16String>);
fn set_selection_target(&self, selection_target: Option<Arc<TemplateValue>>);
fn set_inliner(&self, inliner: Option<Arc<dyn IInliner>>);
fn set_template_data(&self, template_data: Arc<TemplateData>);
fn set_element_tag(&self, element_tag: Option<Arc<dyn IProcessableElementTag>>);
fn get_element_stack_above(&self, context_level: i32) -> Vec<Arc<dyn IProcessableElementTag>>;
fn is_variable_local(&self, name: Option<&Utf16String>) -> bool;
fn increase_level(&self);
fn decrease_level(&self);
fn level(&self) -> i32;
}