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