use crate::evaluation::variable_value::VariableValue;
use async_trait::async_trait;
use drasi_query_ast::ast;
use crate::evaluation::functions::ScalarFunction;
use crate::evaluation::{ExpressionEvaluationContext, FunctionError, FunctionEvaluationError};
#[derive(Debug)]
pub struct Timestamp {}
#[async_trait]
impl ScalarFunction for Timestamp {
async fn call(
&self,
_context: &ExpressionEvaluationContext,
expression: &ast::FunctionExpression,
args: Vec<VariableValue>,
) -> Result<VariableValue, FunctionError> {
if !args.is_empty() {
return Err(FunctionError {
function_name: expression.name.to_string(),
error: FunctionEvaluationError::InvalidArgumentCount,
});
}
let now = std::time::SystemTime::now();
let since_epoch = match now.duration_since(std::time::UNIX_EPOCH) {
Ok(d) => {
if d.as_millis() > i64::MAX as u128 {
return Err(FunctionError {
function_name: expression.name.to_string(),
error: FunctionEvaluationError::OverflowError,
});
} else {
d.as_millis() as i64
}
}
Err(_e) => {
0
}
};
Ok(VariableValue::Integer((since_epoch).into()))
}
}