robinpath 0.2.0

RobinPath - A lightweight, fast scripting language interpreter for automation and data processing
Documentation
use crate::executor::Environment;
use crate::value::Value;

pub fn register(env: &mut Environment) {
    env.register_builtin("random.int", |args, _| {
        let min = args.first().and_then(|v| v.as_number()).unwrap_or(0.0) as i64;
        let max = args.get(1).and_then(|v| v.as_number()).unwrap_or(100.0) as i64;
        // Simple pseudo-random using system time
        let seed = std::time::SystemTime::now()
            .duration_since(std::time::UNIX_EPOCH)
            .unwrap_or_default()
            .subsec_nanos() as i64;
        let range = (max - min).max(1);
        let val = min + (seed.unsigned_abs() as i64 % range);
        Ok(Value::Number(val as f64))
    });

    env.register_builtin("random.float", |_args, _| {
        let seed = std::time::SystemTime::now()
            .duration_since(std::time::UNIX_EPOCH)
            .unwrap_or_default()
            .subsec_nanos();
        let val = (seed as f64) / (u32::MAX as f64);
        Ok(Value::Number(val))
    });

    env.register_builtin("random.uuid", |_args, _| {
        let id = uuid::Uuid::new_v4().to_string();
        Ok(Value::String(id))
    });

    env.register_builtin("random.choice", |args, _| {
        if let Some(Value::Array(arr)) = args.first() {
            if arr.is_empty() {
                return Ok(Value::Null);
            }
            let seed = std::time::SystemTime::now()
                .duration_since(std::time::UNIX_EPOCH)
                .unwrap_or_default()
                .subsec_nanos() as usize;
            let idx = seed % arr.len();
            Ok(arr[idx].clone())
        } else {
            Ok(Value::Null)
        }
    });
}