use std::sync::Arc;
use crate::context::IExpressionContext;
use crate::util::Utf16String;
use super::{
IStandardExpression, StandardExpressionExecutionContext, StandardExpressionResult,
TemplateValue, TokenError,
};
pub struct BooleanTokenExpression {
value: Option<bool>,
}
impl BooleanTokenExpression {
pub fn from_string(value: Option<&Utf16String>) -> Self {
let value = value.is_some_and(|value| value.to_string_lossy().eq_ignore_ascii_case("true"));
Self { value: Some(value) }
}
pub const fn from_boolean(value: Option<bool>) -> Self {
Self { value }
}
pub const fn get_value(&self) -> Option<bool> {
self.value
}
pub fn parse_boolean_token_expression(input: Option<&Utf16String>) -> Option<Self> {
let input = input?;
let text = input.to_string_lossy();
(text.eq_ignore_ascii_case("true") || text.eq_ignore_ascii_case("false"))
.then(|| Self::from_string(Some(input)))
}
}
impl IStandardExpression for BooleanTokenExpression {
fn get_string_representation(&self) -> StandardExpressionResult<Utf16String> {
self.value
.map(|value| Utf16String::from_rust_str(if value { "true" } else { "false" }))
.ok_or_else(|| Box::new(TokenError::NullPointer) as _)
}
fn execute_with_context(
&self,
_context: &dyn IExpressionContext,
_expression_context: &'static StandardExpressionExecutionContext,
) -> StandardExpressionResult<Option<Arc<TemplateValue>>> {
Ok(self
.value
.map(|value| Arc::new(TemplateValue::Boolean(value))))
}
fn is_token_expression(&self) -> bool {
true
}
fn is_boolean_token_expression(&self) -> bool {
true
}
}
impl super::SimpleExpression for BooleanTokenExpression {}