fix merge issues and rhai examples wip
This commit is contained in:
		
							
								
								
									
										9
									
								
								heromodels/examples/project_rhai_wasm/.cargo/config.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								heromodels/examples/project_rhai_wasm/.cargo/config.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
[build]
 | 
			
		||||
# Set the default build target for this project
 | 
			
		||||
target = "wasm32-unknown-unknown"
 | 
			
		||||
 | 
			
		||||
# Configuration for the wasm32-unknown-unknown target
 | 
			
		||||
[target.wasm32-unknown-unknown]
 | 
			
		||||
# Pass --cfg=wasm_js to rustc when compiling for this target.
 | 
			
		||||
# This is required by the getrandom crate.
 | 
			
		||||
rustflags = ["--cfg=wasm_js"] # For getrandom v0.3.x WASM support (required by rhai via ahash)
 | 
			
		||||
							
								
								
									
										20
									
								
								heromodels/examples/project_rhai_wasm/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								heromodels/examples/project_rhai_wasm/Cargo.toml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
[package]
 | 
			
		||||
name = "project_rhai_wasm_example"
 | 
			
		||||
version = "0.1.0"
 | 
			
		||||
edition = "2021"
 | 
			
		||||
 | 
			
		||||
[lib]
 | 
			
		||||
crate-type = ["cdylib"]
 | 
			
		||||
 | 
			
		||||
[dependencies]
 | 
			
		||||
heromodels = { path = "../..", features = ["rhai"] } # Match heromodels main crate
 | 
			
		||||
wasm-bindgen = "0.2"
 | 
			
		||||
web-sys = { version = "0.3", features = ["console"] }
 | 
			
		||||
console_error_panic_hook = "0.1.7"
 | 
			
		||||
js-sys = "0.3"
 | 
			
		||||
getrandom = { version = "0.3.3", features = ["js"] } # Align with rhai's dependency
 | 
			
		||||
 | 
			
		||||
[profile.release]
 | 
			
		||||
# Tell `rustc` to optimize for small code size.
 | 
			
		||||
lto = true
 | 
			
		||||
opt-level = 's'
 | 
			
		||||
							
								
								
									
										52
									
								
								heromodels/examples/project_rhai_wasm/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								heromodels/examples/project_rhai_wasm/index.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="UTF-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
    <title>HeroModels Project Rhai WASM Test</title>
 | 
			
		||||
    <style>
 | 
			
		||||
        body { font-family: sans-serif; margin: 20px; background-color: #f4f4f4; color: #333; }
 | 
			
		||||
        #output { margin-top: 20px; padding: 10px; border: 1px solid #ccc; background-color: #fff; white-space: pre-wrap; }
 | 
			
		||||
        button { padding: 10px 15px; font-size: 16px; cursor: pointer; background-color: #007bff; color: white; border: none; border-radius: 5px; }
 | 
			
		||||
        button:hover { background-color: #0056b3; }
 | 
			
		||||
        h1 { color: #0056b3; }
 | 
			
		||||
    </style>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <h1>HeroModels Project Rhai WASM Test</h1>
 | 
			
		||||
    <p>Open your browser's developer console to see detailed logs from the Rhai script.</p>
 | 
			
		||||
    <button id="runScriptButton">Run Rhai Script in WASM</button>
 | 
			
		||||
    
 | 
			
		||||
    <script type="module">
 | 
			
		||||
        // Import the WASM module
 | 
			
		||||
        import init, { run_project_script_wasm } from './pkg/project_rhai_wasm_example.js';
 | 
			
		||||
 | 
			
		||||
        async function main() {
 | 
			
		||||
            // Initialize the WASM module
 | 
			
		||||
            await init();
 | 
			
		||||
            console.log("WASM module initialized.");
 | 
			
		||||
 | 
			
		||||
            const runButton = document.getElementById('runScriptButton');
 | 
			
		||||
            runButton.onclick = () => {
 | 
			
		||||
                console.log("Button clicked, attempting to run script...");
 | 
			
		||||
                try {
 | 
			
		||||
                    run_project_script_wasm();
 | 
			
		||||
                    console.log("run_project_script_wasm called.");
 | 
			
		||||
                } catch (e) {
 | 
			
		||||
                    console.error("Error calling run_project_script_wasm:", e);
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
             // Automatically run the script on load if desired
 | 
			
		||||
            // console.log("Attempting to run script on load...");
 | 
			
		||||
            // try {
 | 
			
		||||
            //     run_project_script_wasm();
 | 
			
		||||
            //     console.log("run_project_script_wasm called on load.");
 | 
			
		||||
            // } catch (e) {
 | 
			
		||||
            //     console.error("Error calling run_project_script_wasm on load:", e);
 | 
			
		||||
            // }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        main().catch(console.error);
 | 
			
		||||
    </script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										126
									
								
								heromodels/examples/project_rhai_wasm/src/lib.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								heromodels/examples/project_rhai_wasm/src/lib.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,126 @@
 | 
			
		||||
use heromodels::db::{OurDB, Db}; // Import Db trait
 | 
			
		||||
use heromodels::models::projects::rhai::register_projects_rhai_module;
 | 
			
		||||
use rhai::{Engine, Scope, Dynamic, EvalAltResult, Position};
 | 
			
		||||
use std::sync::Arc;
 | 
			
		||||
use wasm_bindgen::prelude::*;
 | 
			
		||||
use web_sys::console;
 | 
			
		||||
 | 
			
		||||
// Called once when the WASM module is instantiated.
 | 
			
		||||
#[wasm_bindgen(start)]
 | 
			
		||||
pub fn main_wasm() -> Result<(), JsValue> {
 | 
			
		||||
    // For better panic messages in the browser console
 | 
			
		||||
    std::panic::set_hook(Box::new(console_error_panic_hook::hook));
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
pub fn run_project_script_wasm() -> Result<(), JsValue> {
 | 
			
		||||
    console::log_1(&"Starting Rhai script execution in WASM...".into());
 | 
			
		||||
 | 
			
		||||
    let script = r#"
 | 
			
		||||
// Test script for Project Rhai integration
 | 
			
		||||
 | 
			
		||||
print("--- Testing Project Rhai Integration (WASM) ---");
 | 
			
		||||
 | 
			
		||||
// Create a new project
 | 
			
		||||
let p1 = new_project()
 | 
			
		||||
    .name("Project Alpha WASM")
 | 
			
		||||
    .description("This is the first test project in WASM.")
 | 
			
		||||
    .owner_id(101)
 | 
			
		||||
    .add_member_id(102)
 | 
			
		||||
    .add_member_id(103)
 | 
			
		||||
    .member_ids([201, 202, 203]) 
 | 
			
		||||
    .add_tag("important")
 | 
			
		||||
    .add_tag("rhai_test")
 | 
			
		||||
    .add_tag("wasm")
 | 
			
		||||
    .tags(["core", "feature_test", "wasm_run"]) 
 | 
			
		||||
    .status(Status::InProgress)
 | 
			
		||||
    .priority(Priority::High)
 | 
			
		||||
    .item_type(ItemType::Feature)
 | 
			
		||||
    .add_base_comment(1001);
 | 
			
		||||
 | 
			
		||||
print("Created project p1: " + p1);
 | 
			
		||||
print("p1.name: " + p1.name);
 | 
			
		||||
print("p1.description: " + p1.description);
 | 
			
		||||
print("p1.owner_id: " + p1.owner_id);
 | 
			
		||||
print("p1.member_ids: " + p1.member_ids);
 | 
			
		||||
print("p1.tags: " + p1.tags);
 | 
			
		||||
print(`p1.status: ${p1.status.to_string()}`);
 | 
			
		||||
print(`p1.priority: ${p1.priority.to_string()}`);
 | 
			
		||||
print(`p1.item_type: ${p1.item_type.to_string()}`);
 | 
			
		||||
print("p1.id: " + p1.id);
 | 
			
		||||
print("p1.created_at: " + p1.created_at);
 | 
			
		||||
print("p1.modified_at: " + p1.modified_at);
 | 
			
		||||
print("p1.comments: " + p1.comments);
 | 
			
		||||
 | 
			
		||||
// Save to DB
 | 
			
		||||
try {
 | 
			
		||||
    set_project(p1);
 | 
			
		||||
    print("Project p1 saved successfully.");
 | 
			
		||||
} catch (err) {
 | 
			
		||||
    print("Error saving project p1: " + err);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Retrieve from DB
 | 
			
		||||
try {
 | 
			
		||||
    let retrieved_p1 = get_project_by_id(1);
 | 
			
		||||
    if retrieved_p1 != () { // Check if Some(project) was returned (None becomes '()')
 | 
			
		||||
        print("Retrieved project by ID 1: " + retrieved_p1);
 | 
			
		||||
        print("Retrieved project name: " + retrieved_p1.name);
 | 
			
		||||
        print("Retrieved project tags: " + retrieved_p1.tags);
 | 
			
		||||
    } else {
 | 
			
		||||
        print("Project with ID 1 not found.");
 | 
			
		||||
    }
 | 
			
		||||
} catch (err) {
 | 
			
		||||
    print("Error retrieving project by ID 1: " + err);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test non-existent project
 | 
			
		||||
try {
 | 
			
		||||
    let non_existent_project = get_project_by_id(999);
 | 
			
		||||
    if non_existent_project != () {
 | 
			
		||||
        print("Error: Found non-existent project 999: " + non_existent_project);
 | 
			
		||||
    } else {
 | 
			
		||||
        print("Correctly did not find project with ID 999.");
 | 
			
		||||
    }
 | 
			
		||||
} catch (err) {
 | 
			
		||||
    print("Error checking for non-existent project: " + err);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
print("--- Project Rhai Integration Test Complete (WASM) ---");
 | 
			
		||||
"#;
 | 
			
		||||
 | 
			
		||||
    let mut engine = Engine::new();
 | 
			
		||||
 | 
			
		||||
    // Redirect Rhai's print to browser console
 | 
			
		||||
    engine.on_print(|text| {
 | 
			
		||||
        console::log_1(&text.into());
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Attempt to initialize OurDB. Sled's behavior in WASM with paths is experimental.
 | 
			
		||||
    // It might work as an in-memory/temporary DB, or it might fail.
 | 
			
		||||
    // Using a specific path and reset=true.
 | 
			
		||||
    let db = match OurDB::new("/project_rhai_wasm_db", true) {
 | 
			
		||||
        Ok(db_instance) => Arc::new(db_instance),
 | 
			
		||||
        Err(e) => {
 | 
			
		||||
            let err_msg = format!("Failed to initialize OurDB for WASM: {}", e);
 | 
			
		||||
            console::error_1(&err_msg.into());
 | 
			
		||||
            return Err(JsValue::from_str(&err_msg));
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    register_projects_rhai_module(&mut engine, db);
 | 
			
		||||
 | 
			
		||||
    let mut scope = Scope::new();
 | 
			
		||||
 | 
			
		||||
    match engine.run_with_scope(&mut scope, script) {
 | 
			
		||||
        Ok(_) => console::log_1(&"Rhai script executed successfully in WASM!".into()),
 | 
			
		||||
        Err(e) => {
 | 
			
		||||
            let err_msg = format!("Rhai script execution failed in WASM: {}\nDetails: {:?}", e, e.to_string());
 | 
			
		||||
            console::error_1(&err_msg.into());
 | 
			
		||||
            return Err(JsValue::from_str(&e.to_string()));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Ok(())
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user