tokio_ipc 0.1.0

Multi-protocol RPC framework built on top of tokio
Documentation
// tokio_socket/examples/example_protocol/mod.rs
use lockshed::SharedCounter;

tokio_socket::rpc::protocol! {
    pub mod server_rpc {
        #[derive(Debug)] server_action1 {
            server_arg1: u32,
            server_arg2: String,
        } -> #[derive(Debug)] {
            server_result1: u32,
            server_result2: String,
        };

        #[derive(Debug)] server_action2 -> #[derive(Debug)] {
            server_result1: u32,
            server_result2: String,
        };

        #[derive(Debug)] server_action3 {
            server_arg1: u32,
            server_arg2: String,
        };
    }
}

tokio_socket::rpc::protocol! {
    pub mod client_rpc {
        #[derive(Debug)] client_action1 {
            client_arg1: u32,
            client_arg2: String,
        } -> #[derive(Debug)] {
            client_result1: u32,
            client_result2: String,
        };

        #[derive(Debug)] client_action2 -> #[derive(Debug)] {
            client_result1: u32,
            client_result2: String,
        };

        #[derive(Debug)] client_action3 {
            client_arg1: u32,
            client_arg2: String,
        };
    }
}

#[derive(Clone)]
pub struct ServerHandler {
    #[allow(unused)]
    pub client: client_rpc::Sender,
}

impl server_rpc::Receive for ServerHandler {
    async fn server_action1(
        &self,
        server_arg1: u32,
        server_arg2: String,
    ) -> anyhow::Result<server_rpc::server_action1::Response> {
        tracing::info!("server action 1");
        Ok(server_rpc::server_action1::Response {
            server_result1: server_arg1 + 1,
            server_result2: format!("hi from server {server_arg2}"),
        })
    }

    async fn server_action2(
        &self,
    ) -> tokio_socket::rpc::anyhow::Result<server_rpc::server_action2::Response> {
        tracing::info!("server action 2");
        Ok(server_rpc::server_action2::Response {
            server_result1: 42,
            server_result2: "hi from server".to_string(),
        })
    }

    async fn server_action3(
        &self,
        server_arg1: u32,
        server_arg2: String,
    ) -> tokio_socket::rpc::anyhow::Result<()> {
        tracing::info!("server action 3: {} {}", server_arg1, server_arg2);
        Ok(())
    }
}

#[derive(Clone)]
pub struct ClientHandler {
    #[allow(unused)]
    pub state: SharedCounter,
}

impl client_rpc::Receive for ClientHandler {
    async fn client_action1(
        &self,
        client_arg1: u32,
        client_arg2: String,
    ) -> tokio_socket::rpc::anyhow::Result<client_rpc::client_action1::Response> {
        tracing::info!("client action 1");
        Ok(client_rpc::client_action1::Response {
            client_result1: client_arg1 + 1,
            client_result2: format!("hi from client {client_arg2}"),
        })
    }

    async fn client_action2(
        &self,
    ) -> tokio_socket::rpc::anyhow::Result<client_rpc::client_action2::Response> {
        tracing::info!("client action 2");
        Ok(client_rpc::client_action2::Response {
            client_result1: 42,
            client_result2: "hi from client".to_string(),
        })
    }

    async fn client_action3(
        &self,
        client_arg1: u32,
        client_arg2: String,
    ) -> tokio_socket::rpc::anyhow::Result<()> {
        tracing::info!("client action 3: {} {}", client_arg1, client_arg2);
        Ok(())
    }
}