datacake-rpc 0.5.1

A zero-copy, actor-like RPC framework using rkyv.
Documentation
use datacake_rpc::{
    Body,
    Channel,
    Handler,
    Request,
    RpcClient,
    RpcService,
    Server,
    ServiceRegistry,
    Status,
};
use rkyv::{Archive, Deserialize, Serialize};

#[repr(C)]
#[derive(Serialize, Deserialize, Archive, Debug)]
#[archive(check_bytes)]
#[archive_attr(derive(Debug))]
pub struct MyMessage {
    name: String,
    age: u32,
    buffer: Vec<u8>,
}

pub struct MyService;

impl RpcService for MyService {
    fn register_handlers(registry: &mut ServiceRegistry<Self>) {
        registry.add_handler::<MyMessage>();
    }
}

#[datacake_rpc::async_trait]
impl Handler<MyMessage> for MyService {
    type Reply = Body;

    async fn on_message(&self, msg: Request<MyMessage>) -> Result<Self::Reply, Status> {
        let bytes = msg.into_inner().into_data();
        Ok(Body::from(bytes.to_vec()))
    }
}

#[tokio::test]
async fn test_stream_body() {
    let addr = test_helper::get_unused_addr();

    let server = Server::listen(addr).await.unwrap();
    server.add_service(MyService);
    println!("Listening to address {}!", addr);

    let client = Channel::connect(addr);
    println!("Connected to address {}!", addr);

    let rpc_client = RpcClient::<MyService>::new(client);

    let msg1 = MyMessage {
        name: "Bobby".to_string(),
        age: 12,
        buffer: vec![0u8; 32 << 10],
    };

    let bytes = rkyv::to_bytes::<_, 1024>(&msg1).unwrap();
    let resp = rpc_client.send(&msg1).await.unwrap();
    let body = hyper::body::to_bytes(resp.into_inner()).await.unwrap();
    assert_eq!(bytes.as_ref(), body.as_ref());

    server.shutdown();
}