use rhai::Engine; use rhai_client::RhaiClient; // To submit tasks use std::time::Duration; use tokio::time::sleep; use worker_lib::spawn_rhai_worker; // Custom function for Rhai fn reverse_string(s: String) -> String { s.chars().rev().collect() } #[tokio::main] async fn main() -> Result<(), Box> { env_logger::init(); log::info!("Starting String Worker Example..."); // 1. Configure and start the Rhai Worker with a custom engine let mut string_engine = Engine::new(); string_engine.register_fn("reverse_it", reverse_string); log::info!("Custom 'reverse_it' function registered with Rhai engine for String Worker."); let (shutdown_tx, shutdown_rx) = tokio::sync::mpsc::channel(1); tokio::spawn(async move { log::info!("String Worker task starting..."); let _worker_handle = spawn_rhai_worker( 0, "string_circle".to_string(), string_engine, "redis://127.0.0.1/".to_string(), shutdown_rx, false, ); }); // Give the worker a moment to start and connect sleep(Duration::from_secs(1)).await; // 2. Use RhaiClient to submit a script to the "string_circle" let client = RhaiClient::new("redis://127.0.0.1/")?; let script_content = r#" let original = "hello world"; let reversed = reverse_it(original); print("String script: original = '" + original + "', reversed = '" + reversed + "'"); reversed // Return the result "#; log::info!("Submitting string script to 'string_circle' and awaiting result..."); let timeout_duration = Duration::from_secs(10); match client.submit_script_and_await_result( "string_circle", script_content.to_string(), None, timeout_duration ).await { Ok(details) => { log::info!("String Worker Example: Task finished. Status: {}, Output: {:?}, Error: {:?}", details.status, details.output, details.error); if details.status == "completed" { assert_eq!(details.output, Some("dlrow olleh".to_string())); log::info!("String Worker Example: Assertion for output \"dlrow olleh\" passed!"); Ok(()) } else { log::error!("String Worker Example: Task completed with error: {:?}", details.error); Err(format!("Task failed with error: {:?}", details.error).into()) } } Err(e) => { log::error!("String Worker Example: Failed to get task result: {}", e); Err(e.into()) } } }