mumu-test 0.1.2

Test suite plugin for the Lava language
Documentation
// test/src/unique_filename.rs

use mumu::{
    parser::interpreter::Interpreter,
    parser::types::{FunctionValue, Value},
};
use std::sync::{Arc, Mutex};
use std::time::{SystemTime, UNIX_EPOCH};

/// Registers the bridging function `test:unique_filename` into the interpreter.
pub fn register_unique_filename(interp: &mut Interpreter) {
    let uf_fn = Arc::new(Mutex::new(unique_filename_bridge));
    interp.register_dynamic_function("test:unique_filename", uf_fn);
    interp.set_variable(
        "test:unique_filename",
        Value::Function(Box::new(FunctionValue::Named("test:unique_filename".to_string())))
    );
}

/// The bridging function `test:unique_filename`.
/// Returns "tmp/test_<8_hex>" based on time since Jan 1, 2024 + 10-bit randomness.
fn unique_filename_bridge(_interp: &mut Interpreter, args: Vec<Value>) -> Result<Value, String> {
    if !args.is_empty() {
        return Err(format!("test:unique_filename => expected 0 arguments, got {}", args.len()));
    }

    // Jan 1, 2024 => Unix timestamp is 1704067200
    let base_epoch_2024: u64 = 1704067200;

    // Current time in seconds
    let now_secs = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .map_err(|_| "SystemTime error: clock before 1970".to_string())?
        .as_secs();

    // Subtract the base epoch
    let relative_secs = now_secs.saturating_sub(base_epoch_2024);

    // 10-bit random => 0..1023
    let rand_10bit = fastrand::u64(0..1024);

    // Combine => 32 bits
    let combined_32 = ((relative_secs << 10) | rand_10bit) & 0xFFFF_FFFF;

    // Format as 8-hex-digit
    let id_hex = format!("{:08x}", combined_32);

    // Final => "tmp/test_<hex>"
    let final_name = format!("tmp/test_{}", id_hex);

    Ok(Value::SingleString(final_name))
}