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;
}
}