ksl 0.1.30

KSL core library and interpreter
Documentation
//! # ksl::builtin::time
//!
//! Built-in function `GetDate` and `GetTime`.

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()
        )))
    }
}