use crate::{Environment, eval::apply::eval_apply, value::Value};
pub(crate) fn get_date(args: &[Value], _env: Environment) -> Result<Value, std::sync::Arc<str>> {
if args.is_empty() {
let now = chrono::Local::now();
Ok(Value::List(std::sync::Arc::new([
Value::Number(chrono::Datelike::year(&now) as f64),
Value::Number(chrono::Datelike::month(&now) as f64),
Value::Number(chrono::Datelike::day(&now) as f64),
])))
} else {
Err(std::sync::Arc::from(format!(
concat!(
"Error[ksl::builtin::GetDate]: ",
"Expected no parameters, but {} were passed."
),
args.len()
)))
}
}
pub(crate) fn get_time(args: &[Value], _env: Environment) -> Result<Value, std::sync::Arc<str>> {
if args.is_empty() {
let now = chrono::Local::now();
Ok(Value::List(std::sync::Arc::new([
Value::Number(chrono::Timelike::hour(&now) as f64),
Value::Number(chrono::Timelike::minute(&now) as f64),
Value::Number(chrono::Timelike::second(&now) as f64),
Value::Number(chrono::Timelike::nanosecond(&now) as f64),
])))
} else {
Err(std::sync::Arc::from(format!(
concat!(
"Error[ksl::builtin::GetTime]: ",
"Expected no parameters, but {} were passed."
),
args.len()
)))
}
}
pub(crate) fn time_it(args: &[Value], env: Environment) -> Result<Value, std::sync::Arc<str>> {
if let [expr] = args {
let start = std::time::Instant::now();
let result = eval_apply(expr, env)?;
let used = start.elapsed();
Ok(Value::List(std::sync::Arc::new([
Value::Number(used.as_secs_f64()),
result,
])))
} else {
Err(std::sync::Arc::from(format!(
concat!(
"Error[ksl::builtin::Timeit]: ",
"Expected 1 parameter, but {} were passed."
),
args.len()
)))
}
}