From f386890a8adf60f0422d4a3c105fcdbcfa749469 Mon Sep 17 00:00:00 2001 From: Maxime Van Hees Date: Fri, 9 May 2025 11:53:09 +0200 Subject: [PATCH] working example to showcase zinit usage in Rhai scripts --- examples/zinit/zinit_basic.rhai | 31 ++++++++++++++++++++++------- src/rhai/zinit.rs | 35 +++++++++++++++++++++++++-------- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/examples/zinit/zinit_basic.rhai b/examples/zinit/zinit_basic.rhai index 4c7f7f7..83e67b0 100644 --- a/examples/zinit/zinit_basic.rhai +++ b/examples/zinit/zinit_basic.rhai @@ -7,13 +7,19 @@ let socket_path = "/var/run/zinit.sock"; print("Listing all services:"); let services = zinit_list(socket_path); -for (name, state) in services { - print(`${name}: ${state}`); +if services.is_empty() { + print("No services found."); +} else { + // Iterate over the keys of the map + for name in services.keys() { + let state = services[name]; + print(`${name}: ${state}`); + } } // Get status of a specific service -let service_name = "example-service"; -print(`\nGetting status for ${service_name}:`); +let service_name = "test"; +print(`Getting status for ${service_name}:`); try { let status = zinit_status(socket_path, service_name); @@ -23,7 +29,7 @@ try { print(`Target: ${status.target}`); print("Dependencies:"); - for (dep, state) in status.after { + for (dep, state) in status.after.keys() { print(` ${dep}: ${state}`); } } catch(err) { @@ -50,16 +56,27 @@ try { let start_result = zinit_start(socket_path, new_service); print(`Service started: ${start_result}`); - // Get logs + // Get logs for a specific service print("\nGetting logs:"); let logs = zinit_logs(socket_path, new_service); for log in logs { print(log); } + + // Or to get all logs (uncomment if needed) + // print("\nGetting all logs:"); + // let all_logs = zinit_logs_all(socket_path); + // + // for log in all_logs { + // print(log); + // } // Clean up print("\nCleaning up:"); + let stop_result = zinit_stop(socket_path, new_service); + print(`Service stopped: ${stop_result}`); + let forget_result = zinit_forget(socket_path, new_service); print(`Service forgotten: ${forget_result}`); @@ -67,4 +84,4 @@ try { print(`Service deleted: ${delete_result}`); } catch(err) { print(`Error: ${err}`); -} \ No newline at end of file +} diff --git a/src/rhai/zinit.rs b/src/rhai/zinit.rs index 74072ab..2128d15 100644 --- a/src/rhai/zinit.rs +++ b/src/rhai/zinit.rs @@ -31,6 +31,7 @@ pub fn register_zinit_module(engine: &mut Engine) -> Result<(), Box Result> { /// Lists all services managed by Zinit. pub fn zinit_list(socket_path: &str) -> Result> { let rt = get_runtime()?; - println!("got runtime: {:?}", rt); let result = rt.block_on(async { client::list(socket_path).await }); - println!("got result: {:?}", result); let services = result.to_rhai_error()?; - println!("got services: {:?}", services); // Convert HashMap to Rhai Map let mut map = Map::new(); for (name, state) in services { map.insert(name.into(), Dynamic::from(state)); } - println!("got map: {:?}", map); Ok(map) } @@ -269,13 +266,13 @@ pub fn zinit_get_service(socket_path: &str, name: &str) -> Result) -> Result> { +/// Gets logs for a specific service. +pub fn zinit_logs(socket_path: &str, filter: &str) -> Result> { let rt = get_runtime()?; - let filter_string = filter.map(|s| s.to_string()); + let filter_string = Some(filter.to_string()); let result = rt.block_on(async { let client = client::get_zinit_client(socket_path).await?; @@ -293,6 +290,28 @@ pub fn zinit_logs(socket_path: &str, filter: Option<&str>) -> Result Result> { + let rt = get_runtime()?; + + let result = rt.block_on(async { + let client = client::get_zinit_client(socket_path).await?; + client.logs(None).await + }); + + let logs = result.to_rhai_error()?; + + // Convert Vec to Rhai Array + let mut array = Array::new(); + for log in logs { + array.push(Dynamic::from(log)); + } + + Ok(array) +} + // Helper function to convert serde_json::Value to rhai::Dynamic fn value_to_dynamic(value: Value) -> Dynamic { match value {