use std::sync::{Arc, OnceLock};
use crate::context::IExpressionContext;
use crate::util::Utf16String;
use super::{
IStandardExpression, StandardExpressionExecutionContext, StandardExpressionResult,
TemplateValue,
};
pub struct NoOpTokenExpression;
impl NoOpTokenExpression {
pub const fn new() -> Self {
Self
}
pub fn parse_no_op_token_expression(input: Option<&Utf16String>) -> Option<Arc<Self>> {
let input = input?;
(input.as_utf16() == [b'_' as u16]).then(Self::singleton)
}
fn singleton() -> Arc<Self> {
static SINGLETON: OnceLock<Arc<NoOpTokenExpression>> = OnceLock::new();
Arc::clone(SINGLETON.get_or_init(|| Arc::new(Self)))
}
}
impl Default for NoOpTokenExpression {
fn default() -> Self {
Self::new()
}
}
impl IStandardExpression for NoOpTokenExpression {
fn get_string_representation(&self) -> StandardExpressionResult<Utf16String> {
Ok(Utf16String::from_rust_str("_"))
}
fn execute_with_context(
&self,
_context: &dyn IExpressionContext,
_expression_context: &'static StandardExpressionExecutionContext,
) -> StandardExpressionResult<Option<Arc<TemplateValue>>> {
Ok(Some(Arc::new(TemplateValue::NoOp)))
}
fn is_token_expression(&self) -> bool {
true
}
}
impl super::SimpleExpression for NoOpTokenExpression {}