use nexar::{CpuAdapter, NexarClient};
use std::sync::Arc;
const FN_ADD: u16 = 1;
#[tokio::main]
async fn main() -> nexar::Result<()> {
let adapter = Arc::new(CpuAdapter::new());
let clients: Vec<Arc<NexarClient>> = NexarClient::bootstrap_local(2, adapter)
.await?
.into_iter()
.map(Arc::new)
.collect();
let c0 = Arc::clone(&clients[0]);
let c1 = Arc::clone(&clients[1]);
c1.register_rpc(
FN_ADD,
Arc::new(|args: &[u8]| -> Vec<u8> {
let a = f32::from_le_bytes(args[0..4].try_into().unwrap());
let b = f32::from_le_bytes(args[4..8].try_into().unwrap());
let sum = a + b;
sum.to_le_bytes().to_vec()
}),
)
.await;
let server = {
let c1 = Arc::clone(&c1);
tokio::spawn(async move {
let dispatcher = c1.rpc_dispatcher();
let msg = c1.recv_rpc_request(0).await.unwrap();
if let nexar::NexarMessage::Rpc {
req_id,
fn_id,
payload,
} = msg
{
dispatcher
.handle_request(c1.peer(0).unwrap(), req_id, fn_id, &payload)
.await
.unwrap();
}
})
};
let mut args = Vec::new();
args.extend_from_slice(&3.0f32.to_le_bytes());
args.extend_from_slice(&4.0f32.to_le_bytes());
let result = c0.rpc(1, FN_ADD, &args).await?;
let sum = f32::from_le_bytes(result[0..4].try_into().unwrap());
println!("rank 0 called add(3.0, 4.0) on rank 1 => {sum}");
server.await.unwrap();
Ok(())
}