use std::sync::{Arc, Weak};
use crate::TemplateMode;
use crate::context::IExpressionContext;
use crate::engine::TemplateData;
use crate::util::{DateUtils, DateValue, Utf16String, ValidateError};
pub struct ExecutionInfo {
context: Weak<dyn IExpressionContext>,
now: DateValue,
}
impl ExecutionInfo {
pub fn new(context: Option<Arc<dyn IExpressionContext>>) -> Result<Self, ValidateError> {
let context = context.ok_or_else(|| ValidateError::IllegalArgument {
message: Some("Context cannot be null".to_owned()),
})?;
if context.as_template_context().is_none() {
return Err(ValidateError::IllegalArgument {
message: Some("Context must implement ITemplateContext".to_owned()),
});
}
let now = DateUtils::create_now(None, Some(&context.get_locale()));
Ok(Self {
context: Arc::downgrade(&context),
now,
})
}
pub fn get_template_name(&self) -> Option<Utf16String> {
self.template_context()?
.as_template_context()?
.get_template_data()
.get_template()
.cloned()
}
pub fn get_template_mode(&self) -> Option<TemplateMode> {
self.template_context()?
.as_template_context()?
.get_template_data()
.get_template_mode()
}
pub fn get_processed_template_name(&self) -> Option<Utf16String> {
self.template_context()?
.as_template_context()?
.get_template_stack()
.first()
.and_then(|template_data| template_data.get_template().cloned())
}
pub fn get_processed_template_mode(&self) -> Option<TemplateMode> {
self.template_context()?
.as_template_context()?
.get_template_stack()
.first()
.and_then(|template_data| template_data.get_template_mode())
}
pub fn get_template_names(&self) -> Vec<Option<Utf16String>> {
self.template_context()
.and_then(|context| {
context
.as_template_context()
.map(|context| context.get_template_stack())
})
.unwrap_or_default()
.into_iter()
.map(|data| data.get_template().cloned())
.collect()
}
pub fn get_template_modes(&self) -> Vec<Option<TemplateMode>> {
self.template_context()
.and_then(|context| {
context
.as_template_context()
.map(|context| context.get_template_stack())
})
.unwrap_or_default()
.into_iter()
.map(|template_data| template_data.get_template_mode())
.collect()
}
pub fn get_template_stack(&self) -> Vec<Arc<TemplateData>> {
self.template_context()
.and_then(|context| {
context
.as_template_context()
.map(|context| context.get_template_stack())
})
.unwrap_or_default()
}
pub const fn get_now(&self) -> &DateValue {
&self.now
}
fn template_context(&self) -> Option<Arc<dyn IExpressionContext>> {
self.context
.upgrade()
.filter(|context| context.as_template_context().is_some())
}
}