rayrust 0.1.0

Rust SDK for Ray distributed computing — wraps the Ray C++ SDK via FFI
//! Example: Ray remote task in local mode.
//!
//! Tests:
//! - #[remote] macro: callback generation + registration + caller
//! - put/get (i32, String)
//! - remote task: add(1, 2) → 3
//! - namespace query

use rayrust::prelude::*;

#[rayrust::remote]
fn add(a: i32, b: i32) -> i32 {
    a + b
}

#[rayrust::remote]
fn greet(name: String) -> String {
    format!("Hello, {}!", name)
}

fn main() {
    // Register remote functions BEFORE init
    println!("Registering remote functions...");
    // These are generated by the #[remote] macro
    // We need to call them — but they're generated with specific names
    // Let's call them directly
    // add_register();
    // greet_register();

    println!("\n--- Init (local mode) ---");
    rayrust::init_with_config(&RayConfig::local()).expect("local init failed");
    println!("✓ Ray initialized (local mode)");

    // ── Put / Get ──────────────────────────────────────────
    println!("\n--- Put / Get ---");
    let obj = rayrust::put(&42i32);
    println!("Put 42i32 → ObjectRef(id_len={})", obj.id().len());
    match rayrust::get(&obj) {
        Ok(val) => println!("Get → {}", val),
        Err(e) => println!("Get failed: {}", e),
    }

    let obj2 = rayrust::put(&"hello ray from rust!".to_string());
    match rayrust::get(&obj2) {
        Ok(val) => println!("Get String → {}", val),
        Err(e) => println!("Get String failed: {}", e),
    }

    // ── Remote Task (local mode) ───────────────────────────
    println!("\n--- Remote Task (local mode) ---");

    // Register the function with FunctionManager
    add_register();
    greet_register();
    println!("✓ Functions registered");

    // Call add(1, 2)
    let obj_ref = add_remote(1, 2);
    println!("Task 'add(1, 2)' submitted → ObjectRef(id_len={})", obj_ref.id().len());
    match obj_ref.get() {
        Ok(val) => println!("Task result: {}", val),
        Err(e) => println!("Task result get failed: {}", e),
    }

    // Call greet("Ray")
    let obj_ref2 = greet_remote("Ray".to_string());
    println!("Task 'greet(\"Ray\")' submitted");
    match obj_ref2.get() {
        Ok(val) => println!("Greet result: {}", val),
        Err(e) => println!("Greet result get failed: {}", e),
    }

    // ── Namespace ─────────────────────────────────────────
    println!("\n--- Namespace ---");
    match rayrust::get_namespace() {
        Ok(ns) => println!("Namespace: {}", ns),
        Err(e) => println!("Get namespace failed: {}", e),
    }

    // ── Shutdown ──────────────────────────────────────────
    println!("\n--- Shutdown ---");
    rayrust::shutdown();
    println!("✓ Ray shutdown");
}