use crate::{
error::{RpcError, RpcResult},
io::Message,
Identity,
};
use capnp::{
message::{Reader, ReaderOptions},
serialize::OwnedSegments,
serialize_packed as ser,
traits::FromPointerReader,
};
use std::marker::PhantomData;
pub type Result<T> = capnp::Result<T>;
pub struct MsgReader<'s, T: FromPointerReader<'s>> {
r: Reader<OwnedSegments>,
_t: &'s PhantomData<T>,
}
impl<'s, T: FromPointerReader<'s>> MsgReader<'s, T> {
pub fn new(buf: Vec<u8>) -> Result<Self> {
ser::read_message(buf.as_slice(), ReaderOptions::new()).map(|r| Self {
r,
_t: &PhantomData,
})
}
pub fn get_root(&'s self) -> Result<T> {
self.r.get_root()
}
}
pub fn resp_id(msg: Message) -> RpcResult<Identity> {
use crate::rpc::sdk_reply::{HashId, Reader};
let Message {
id: _,
to: _,
from: _,
data,
} = msg;
let r = MsgReader::new(data)?;
let reader: Reader = r.get_root()?;
match reader.which() {
Ok(HashId(Ok(id))) => Ok(Identity::from_string(&id.to_string())),
_ => Err(RpcError::EncoderFault(
"Operation failed: unknown component address!".into(),
)),
}
}