use std::sync::Arc;
use crate::util::{Utf16String, ValidateError};
use super::{IStandardExpression, StandardExpressionResult};
pub struct Each {
iter_var: Arc<dyn IStandardExpression>,
status_var: Option<Arc<dyn IStandardExpression>>,
iterable: Arc<dyn IStandardExpression>,
}
impl Each {
pub fn new(
iter_var: Option<Arc<dyn IStandardExpression>>,
status_var: Option<Arc<dyn IStandardExpression>>,
iterable: Option<Arc<dyn IStandardExpression>>,
) -> Result<Self, ValidateError> {
let iter_var = iter_var.ok_or_else(|| ValidateError::IllegalArgument {
message: Some("Iteration variable cannot be null".to_owned()),
})?;
let iterable = iterable.ok_or_else(|| ValidateError::IllegalArgument {
message: Some("Iterable cannot be null".to_owned()),
})?;
Ok(Self {
iter_var,
status_var,
iterable,
})
}
pub fn get_iter_var(&self) -> &dyn IStandardExpression {
self.iter_var.as_ref()
}
pub fn has_status_var(&self) -> bool {
self.status_var.is_some()
}
pub fn get_status_var(&self) -> Option<&dyn IStandardExpression> {
self.status_var.as_deref()
}
pub fn get_iterable(&self) -> &dyn IStandardExpression {
self.iterable.as_ref()
}
pub fn get_string_representation(&self) -> StandardExpressionResult<Utf16String> {
let mut units = self
.iter_var
.get_string_representation()?
.as_utf16()
.to_vec();
if let Some(status_var) = &self.status_var {
units.push(b',' as u16);
units.extend_from_slice(status_var.get_string_representation()?.as_utf16());
}
units.extend_from_slice(&[b' ' as u16, b':' as u16, b' ' as u16]);
units.extend_from_slice(self.iterable.get_string_representation()?.as_utf16());
Ok(Utf16String::from_utf16(units))
}
}