about summary refs log blame commit diff
path: root/users/tazjin/rlox/src/treewalk/interpreter/builtins.rs
blob: 709e53c7c0eb3905900f92a68c32e7b740bbee62 (plain) (tree)
1
2
3
4
5
6


                                        

                                     
                                        


















                                                                        
use std::fmt;
use std::time::{SystemTime, UNIX_EPOCH};

use crate::treewalk::errors::Error;
use crate::treewalk::parser::Literal;
use crate::treewalk::interpreter::Value;

pub trait Builtin: fmt::Debug {
    fn arity(&self) -> usize;
    fn call(&self, args: Vec<Value>) -> Result<Value, Error>;
}

// Builtin to return the current timestamp.
#[derive(Debug)]
pub struct Clock {}
impl Builtin for Clock {
    fn arity(&self) -> usize {
        0
    }

    fn call(&self, _args: Vec<Value>) -> Result<Value, Error> {
        let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap();
        Ok(Value::Literal(Literal::Number(now.as_secs() as f64)))
    }
}