use cloud_task_executor::*; use serde_json::{json, Value}; #[cte_task(name = "my_task")] async fn my_task(ctx: Context, payload: Value) -> Result<String, String> { let sample_value = ctx.get("sample_key").expect("sample_key not found"); let payload_str = payload.get("payload_key").and_then(Value::as_str).unwrap_or("default_value"); let runtime = ctx.get(KEY_RUNTIME).unwrap(); println!("Task running with sample value: {}, payload: {}, runtime {}", sample_value, payload_str, runtime); Ok("Task result".to_string()) } #[tokio::main] async fn main() { let mut executor = Executor::new(); executor.set_initializer(|ctx| { ctx.set("sample_key", "sample_value".to_string()); }); executor.set_after_action(|_ctx, payload, result| { println!("Task executed with payload: {:?}, result: {:?}", payload, result); result.map(|res| format!("{} - after action", res)) }); executor.set_before_action(|ctx, payload| { ctx.set("modified_key", "test".to_string()); let mut new_payload = json!({"test": 1}); if let Value::Object(map) = payload { for (k, v) in map { new_payload[k] = v.clone() } } new_payload }); executor.set_task(my_task()); executor.run().await.expect("Executor failed to run"); }