use serde_json::json;
use std::sync::Arc;
use malkuth::{Client, Router, Supervised, Transport, transport::TcpTransport};
#[tokio::main]
async fn main() {
let listener = TcpTransport
.listen("tcp://127.0.0.1:0")
.await
.expect("bind failed");
let addr = listener.local_addr().unwrap();
println!("JSON-RPC listening on tcp://{addr}");
let supervised = Supervised::new().signals();
let ctrl = supervised.drain_controller();
let router = Arc::new(
Router::new()
.lifecycle(ctrl.clone(), None)
.route("ping", |_| Box::pin(async { Ok(json!("pong")) })),
);
println!("Press Ctrl-C to stop…");
supervised
.serve_rpc_listener(listener, router)
.await
.expect("serve failed");
println!("Service stopped.");
let mut client = Client::connect(&TcpTransport, &format!("tcp://{addr}"))
.await
.expect("connect failed");
let resp = client.call("ping", json!({})).await.unwrap();
println!("ping → {resp}");
}