use crate::{
io::Message,
parser::{MsgReader, Result},
rpc::{capabilities as cap, sdk_reply as repl},
Service,
};
use capnp::{message::Builder as Bld, serialize_packed};
use identity::Identity;
pub fn register(service: &Service) -> Result<Message> {
let mut msg = Bld::new_default();
let cap = msg.init_root::<cap::Builder>();
let reg = cap.init_register();
let mut serv = reg.init_service();
serv.set_name(&service.name);
serv.set_description(&service.description);
serv.set_version(service.version as i16);
let mut buffer = vec![];
serialize_packed::write_message(&mut buffer, &msg)?;
Ok(_internal::make_carrier(
"org.qaul._broker".into(),
service.name.clone(),
buffer,
))
}
pub fn resp_bool(b: bool) -> Vec<u8> {
let mut msg = Bld::new_default();
let mut reply = msg.init_root::<repl::Builder>();
reply.set_success(b);
let mut buffer = vec![];
serialize_packed::write_message(&mut buffer, &msg).unwrap();
buffer
}
pub fn resp_id(id: Identity) -> Vec<u8> {
let mut msg = Bld::new_default();
let mut reply = msg.init_root::<repl::Builder>();
reply.set_hash_id(&id.to_string());
let mut buffer = vec![];
serialize_packed::write_message(&mut buffer, &msg).unwrap();
buffer
}
pub fn parse_rpc_msg(buffer: Vec<u8>) -> Result<MsgReader<'static, cap::Reader<'static>>> {
MsgReader::new(buffer)
}
#[cfg_attr(not(feature = "internals"), doc(hidden))]
pub mod _internal {
use crate::{error::RpcResult, io::Message, parser::MsgReader, types::rpc_message, Identity};
use capnp::{message::Builder as Bld, serialize_packed};
pub fn make_carrier(to: String, from: String, data: Vec<u8>) -> Message {
let id = Identity::random();
Message { id, to, from, data }
}
pub fn to(cmsg: Message) -> Vec<u8> {
let Message { id, to, from, data } = cmsg;
let mut msg = Bld::new_default();
let mut carrier = msg.init_root::<rpc_message::Builder>();
carrier.set_id(&id.to_string());
carrier.set_to(&to);
carrier.set_from(&from);
carrier.set_data(&data);
let mut buffer = vec![];
serialize_packed::write_message(&mut buffer, &msg).unwrap();
buffer
}
pub fn from(buffer: Vec<u8>) -> RpcResult<(Identity, String, String, Vec<u8>)> {
let msg = MsgReader::new(buffer)?;
let carrier: rpc_message::Reader = msg.get_root().unwrap();
let id = carrier.get_id()?;
let to = carrier.get_to()?;
let from = carrier.get_from()?;
let data = carrier.get_data()?;
Ok((
Identity::from_string(&id.to_string()),
to.to_string(),
from.to_string(),
data.to_vec(),
))
}
}