use pest_consume::Parser;
use crate::sql::expression::parser::{ExpressionParser, Result, Rule};
use crate::sql::expression::value::Value;
use crate::TODO_DATE_FORMAT;
#[derive(Eq, PartialEq, Debug)]
pub struct Function {
pub name: String,
pub args: Vec<Value>,
}
#[allow(deprecated)]
fn date(args: &[Value]) -> Value {
match args {
[Value::Text(date_string)] => {
match date_string.as_str() {
"today" => Value::Date(time::Date::today()),
s => Value::Date(time::Date::parse(s, TODO_DATE_FORMAT).unwrap()),
}
}
_ => unimplemented!(),
}
}
impl Function {
pub fn apply(&self) -> Value {
match self.name.as_str() {
"date" => date(&self.args[..]),
_ => unimplemented!(),
}
}
pub fn parse(input: &str) -> Result<Function> {
let nodes = ExpressionParser::parse(Rule::function, input)?;
let node = nodes.single()?;
let f = ExpressionParser::function(node)?;
Ok(f)
}
}