Macro server_requests_variant

Source
macro_rules! server_requests_variant {
    ($req_type:ty, OptBufNo, $rep_type:ty, $rep_opt_buf:ident) => { ... };
    ($req_type:ty, OptBufYes, $rep_type:ty, $rep_opt_buf:ident) => { ... };
}
Expand description

Macro that builds the required types to handle calls via RPC from the server.

Examples

use urpc::{server_requests, server::{self, Request}, consts, OptBufNo, OptBufYes};

server_requests! {
    ServerRequest;
    (0, ping, Ping([u8; 4], OptBufNo, [u8; 4], OptBufNo)),
    (1, send_bytes, SendBytes((), OptBufYes, (), OptBufNo))
}

let mut rpc_server = server::RpcServer::new(32);
let mut recv_buf = vec![0; 32];
let mut send_buf = vec![0; 32];

// We fill recv_buf with some precalculated requets to simulate a client request
recv_buf[..11].copy_from_slice(&[0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03]);
recv_buf[11..11+17].copy_from_slice(&[0x01, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09]);

let mut pos = 0;
let mut read_len = consts::REQ_HEADER_LEN;
let mut send_buf_bytes = 0;
loop {
    let buf = &recv_buf[pos..pos + read_len];
    match ServerRequest::from_rpc(&mut rpc_server, &buf).unwrap() {
        server::ParseResult::NeedBytes(n) => {
            read_len = n;
        }
        server::ParseResult::Request(req) => {
            read_len = consts::REQ_HEADER_LEN;
            match req {
                ServerRequest::Ping(ping) => {
                    println!("request ping: {:?}", ping.body);
                    let ping_body = ping.body;
                    send_buf_bytes = ping.reply(ping_body, &mut send_buf).unwrap();
                    println!("reply bytes: {:02x?}", &send_buf[..send_buf_bytes]);
                }
                ServerRequest::SendBytes((send_bytes, buf)) => {
                    println!("request send_bytes: {:?}, {:?}", send_bytes.body, buf);
                    send_buf_bytes = send_bytes.reply((), &mut send_buf).unwrap();
                    println!("reply bytes: {:02x?}", &send_buf[..send_buf_bytes]);
                }
            }
        }
    }
    // Send send_buf over the network
    // [...]

    pos += read_len;
    // Break once all the received bytes have been parsed
    println!("pos: {}, read_len: {}", pos, read_len);
    if pos == 11 + 17 {
        break;
    }
}