working example to showcase zinit usage in Rhai scripts

This commit is contained in:
Maxime Van Hees
2025-05-09 11:53:09 +02:00
parent 61bd58498a
commit f386890a8a
2 changed files with 51 additions and 15 deletions

View File

@@ -31,6 +31,7 @@ pub fn register_zinit_module(engine: &mut Engine) -> Result<(), Box<EvalAltResul
engine.register_fn("zinit_delete_service", zinit_delete_service);
engine.register_fn("zinit_get_service", zinit_get_service);
engine.register_fn("zinit_logs", zinit_logs);
engine.register_fn("zinit_logs_all", zinit_logs_all);
Ok(())
}
@@ -65,22 +66,18 @@ fn get_runtime() -> Result<Runtime, Box<EvalAltResult>> {
/// Lists all services managed by Zinit.
pub fn zinit_list(socket_path: &str) -> Result<Map, Box<EvalAltResult>> {
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<String, String> 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<Dynamic, Box<E
}
}
/// Wrapper for zinit_client::logs
/// Wrapper for zinit_client::logs with a filter
///
/// Gets logs for a service.
pub fn zinit_logs(socket_path: &str, filter: Option<&str>) -> Result<Array, Box<EvalAltResult>> {
/// Gets logs for a specific service.
pub fn zinit_logs(socket_path: &str, filter: &str) -> Result<Array, Box<EvalAltResult>> {
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<Array, Box<
Ok(array)
}
/// Wrapper for zinit_client::logs without a filter
///
/// Gets all logs.
pub fn zinit_logs_all(socket_path: &str) -> Result<Array, Box<EvalAltResult>> {
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<String> 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 {