use std::sync::Arc;
use crate::context::IExpressionContext;
use crate::util::Utf16String;
use super::{
IStandardExpression, StandardExpressionExecutionContext, StandardExpressionResult,
TemplateValue,
};
pub struct NullTokenExpression;
impl NullTokenExpression {
pub const fn new() -> Self {
Self
}
pub fn parse_null_token_expression(input: Option<&Utf16String>) -> Option<Arc<Self>> {
let input = input?;
input
.to_string_lossy()
.eq_ignore_ascii_case("null")
.then(Self::singleton)
}
fn singleton() -> Arc<Self> {
static SINGLETON: std::sync::OnceLock<Arc<NullTokenExpression>> =
std::sync::OnceLock::new();
Arc::clone(SINGLETON.get_or_init(|| Arc::new(Self)))
}
}
impl Default for NullTokenExpression {
fn default() -> Self {
Self::new()
}
}
impl IStandardExpression for NullTokenExpression {
fn get_string_representation(&self) -> StandardExpressionResult<Utf16String> {
Ok(Utf16String::from_rust_str("null"))
}
fn execute_with_context(
&self,
_context: &dyn IExpressionContext,
_expression_context: &'static StandardExpressionExecutionContext,
) -> StandardExpressionResult<Option<Arc<TemplateValue>>> {
Ok(None)
}
fn is_token_expression(&self) -> bool {
true
}
}
impl super::SimpleExpression for NullTokenExpression {}