use crate::evaluation::variable_value::{zoned_datetime::ZonedDateTime, VariableValue};
use crate::models::validate_effective_from;
use async_trait::async_trait;
use drasi_query_ast::ast;
use crate::evaluation::{ExpressionEvaluationContext, FunctionError, FunctionEvaluationError};
use super::ScalarFunction;
#[derive(Debug)]
pub struct ElementId {}
#[async_trait]
impl ScalarFunction for ElementId {
async fn call(
&self,
_context: &ExpressionEvaluationContext,
expression: &ast::FunctionExpression,
args: Vec<VariableValue>,
) -> Result<VariableValue, FunctionError> {
if args.len() != 1 {
return Err(FunctionError {
function_name: expression.name.to_string(),
error: FunctionEvaluationError::InvalidArgumentCount,
});
}
match &args[0] {
VariableValue::Element(e) => Ok(VariableValue::String(
e.get_reference().element_id.to_string(),
)),
_ => Err(FunctionError {
function_name: expression.name.to_string(),
error: FunctionEvaluationError::InvalidArgument(0),
}),
}
}
}
#[derive(Debug)]
pub struct ChangeDateTime {}
#[async_trait]
impl ScalarFunction for ChangeDateTime {
async fn call(
&self,
_context: &ExpressionEvaluationContext,
expression: &ast::FunctionExpression,
args: Vec<VariableValue>,
) -> Result<VariableValue, FunctionError> {
if args.len() != 1 {
return Err(FunctionError {
function_name: expression.name.to_string(),
error: FunctionEvaluationError::InvalidArgumentCount,
});
}
match &args[0] {
VariableValue::Element(e) => {
let ts = e.get_effective_from();
debug_assert!(
validate_effective_from(ts).is_ok(),
"effective_from value {ts} appears to be in the wrong unit (expected milliseconds)",
);
Ok(VariableValue::ZonedDateTime(
ZonedDateTime::from_epoch_millis(ts as i64),
))
}
_ => Err(FunctionError {
function_name: expression.name.to_string(),
error: FunctionEvaluationError::InvalidArgument(0),
}),
}
}
}