use serde_json::json;
use std::env;
use tokio::time::{sleep, Duration};
use zinit_client::ZinitClient;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
let socket_path = env::args()
.nth(1)
.unwrap_or_else(|| "/tmp/zinit.sock".to_string());
println!("๐ Universal Zinit Client Demo");
println!("๐ Socket path: {}", socket_path);
println!("๐ Demonstrating universal interface with automatic protocol detection");
println!();
let client = ZinitClient::new(&socket_path);
println!("๐ Test 1: Protocol Detection & Service Listing");
let initial_services = match client.list().await {
Ok(services) => {
println!("โ
Connection successful!");
println!("๐ Found {} services", services.len());
for (name, state) in services.iter().take(3) {
println!(" - {}: {:?}", name, state);
}
if services.len() > 3 {
println!(" ... and {} more", services.len() - 3);
}
services
}
Err(e) => {
println!("โ Connection failed: {}", e);
return Ok(());
}
};
println!();
println!("๐ง Test 2: Service Creation & Deletion");
let test_service_name = "demo-service";
let test_config = json!({
"exec": "sleep 30",
"oneshot": false
});
if initial_services.contains_key(test_service_name) {
println!("๐งน Cleaning up existing test service...");
match client.delete_service(test_service_name).await {
Ok(_) => println!(" โ
Existing service cleaned up"),
Err(e) => println!(" โ ๏ธ Cleanup warning: {}", e),
}
}
let supports_creation = match client.create_service(test_service_name, test_config).await {
Ok(_) => {
println!("โ
Service creation: SUPPORTED");
println!("๐ฏ Detected: New server (v0.2.25+) with JSON-RPC protocol");
true
}
Err(e) => {
if e.to_string().contains("not supported") {
println!("โน๏ธ Service creation: NOT SUPPORTED");
println!("๐ฏ Detected: Old server (v0.2.14) with raw command protocol");
println!("๐ก Suggestion: {}", e);
false
} else {
println!("โ Service creation error: {}", e);
false
}
}
};
println!();
println!("๐ Test 3: Service Status Operations");
if let Some((service_name, _)) = initial_services.iter().next() {
match client.status(service_name).await {
Ok(status) => {
println!("โ
Status check: SUCCESS");
println!(" Service: {}", service_name);
println!(" State: {:?}", status.state);
println!(" Target: {:?}", status.target);
if status.pid > 0 {
println!(" PID: {}", status.pid);
}
if !status.after.is_empty() {
println!(" Dependencies: {} services", status.after.len());
}
}
Err(e) => {
println!("โ Status check: FAILED - {}", e);
}
}
} else {
println!("โ ๏ธ No services available for status testing");
}
println!();
if supports_creation {
println!("๐ Test 4: Service Lifecycle Operations");
print!(" ๐ก Monitor: ");
match client.monitor(test_service_name).await {
Ok(_) => println!("SUCCESS"),
Err(e) => println!("FAILED - {}", e),
}
sleep(Duration::from_millis(500)).await;
print!(" โถ๏ธ Start: ");
match client.start(test_service_name).await {
Ok(_) => println!("SUCCESS"),
Err(e) => println!("FAILED - {}", e),
}
sleep(Duration::from_secs(1)).await;
print!(" ๐ Status after start: ");
match client.status(test_service_name).await {
Ok(status) => {
println!("SUCCESS - State: {:?}, PID: {}", status.state, status.pid);
}
Err(e) => println!("FAILED - {}", e),
}
print!(" โน๏ธ Stop: ");
match client.stop(test_service_name).await {
Ok(_) => println!("SUCCESS"),
Err(e) => println!("FAILED - {}", e),
}
sleep(Duration::from_secs(1)).await;
print!(" ๐ Restart: ");
match client.restart(test_service_name).await {
Ok(_) => println!("SUCCESS"),
Err(e) => println!("FAILED - {}", e),
}
sleep(Duration::from_secs(1)).await;
print!(" ๐ Kill (SIGTERM): ");
match client.kill(test_service_name, "SIGTERM").await {
Ok(_) => println!("SUCCESS"),
Err(e) => println!("FAILED - {}", e),
}
print!(" ๐ง Forget: ");
match client.forget(test_service_name).await {
Ok(_) => println!("SUCCESS"),
Err(e) => println!("FAILED - {}", e),
}
print!(" ๐๏ธ Delete: ");
match client.delete_service(test_service_name).await {
Ok(_) => println!("SUCCESS"),
Err(e) => println!("FAILED - {}", e),
}
println!();
}
println!("๐ Test 5: Final Service List");
match client.list().await {
Ok(services) => {
println!("โ
Final service count: {}", services.len());
if supports_creation {
if services.contains_key(test_service_name) {
println!("โ ๏ธ Test service still exists (cleanup incomplete)");
} else {
println!("โ
Test service properly cleaned up");
}
}
}
Err(e) => {
println!("โ Final list failed: {}", e);
}
}
println!();
println!("๐ Universal Zinit Client Demo Complete!");
println!();
println!("๐ Demo Results Summary:");
println!(" โ
Protocol detection: Working");
println!(" โ
Service listing: Working");
println!(" โ
Service status: Working");
if supports_creation {
println!(" โ
Service creation: Working (New Server)");
println!(" โ
Service lifecycle: Working (Start/Stop/Restart)");
println!(" โ
Service management: Working (Monitor/Forget/Kill)");
println!(" โ
Service deletion: Working");
println!(" ๐ฏ Server Type: New (v0.2.25+) with JSON-RPC");
} else {
println!(" โน๏ธ Service creation: Not supported (Old Server)");
println!(" ๐ฏ Server Type: Old (v0.2.14) with Raw Commands");
}
println!();
println!("๐ Universal interface successfully adapts to both server versions!");
Ok(())
}