use rhai::Engine; use rhai_client::RhaiClient; // To submit tasks use worker_lib::{run_worker_loop, Args as WorkerArgs}; // To run the 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 worker_args = WorkerArgs { redis_url: "redis://127.0.0.1/".to_string(), circles: vec!["string_circle".to_string()], // Worker listens on a specific queue }; let worker_args_clone = worker_args.clone(); tokio::spawn(async move { log::info!("String Worker task starting..."); if let Err(e) = run_worker_loop(string_engine, worker_args_clone).await { log::error!("String Worker loop failed: {}", e); } }); // 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 poll_interval = Duration::from_millis(500); match client.submit_script_and_await_result( "string_circle", script_content.to_string(), None, timeout_duration, poll_interval ).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())); // Rhai strings include quotes in `debug` format 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()) } } }