use rhai::Engine; use rhai_client::RhaiClient; // To submit tasks use uuid::Uuid; // For generating task_id use rhailib_worker::spawn_rhai_worker; use std::time::Duration; use tokio::time::sleep; // 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); let task_id = Uuid::new_v4().to_string(); match client .submit_script_and_await_result( "string_circle", script_content.to_string(), task_id, // Pass the generated task_id timeout_duration, None, ) .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()) } } }