use internet2::addr::ServiceAddr;
use internet2::session::LocalSession;
use internet2::{
CreateUnmarshaller, SendRecvMessage, TypedEnum, Unmarshall, Unmarshaller, ZmqSocketType,
};
use microservices::rpc::ServerError;
use microservices::ZMQ_CONTEXT;
use crate::{FailureCode, Reply, Request};
#[derive(Clone, PartialEq, Eq, Debug, Display)]
#[display(Debug)]
pub struct Config {
pub rpc_endpoint: ServiceAddr,
pub verbose: u8,
}
pub struct Client {
session_rpc: LocalSession,
unmarshaller: Unmarshaller<Reply>,
}
impl Client {
pub fn with(connect: &ServiceAddr) -> Result<Self, ServerError<FailureCode>> {
debug!("Initializing runtime");
trace!("Connecting to bpd daemon at {}", connect);
let session_rpc =
LocalSession::connect(ZmqSocketType::Req, connect, None, None, &ZMQ_CONTEXT)?;
Ok(Self {
session_rpc,
unmarshaller: Reply::create_unmarshaller(),
})
}
pub fn request(&mut self, request: Request) -> Result<Reply, ServerError<FailureCode>> {
trace!("Sending request to the server: {:?}", request);
let data = request.serialize();
trace!("Raw request data ({} bytes): {:02X?}", data.len(), data);
self.session_rpc.send_raw_message(&data)?;
trace!("Awaiting reply");
let raw = self.session_rpc.recv_raw_message()?;
trace!("Got reply ({} bytes), parsing: {:02X?}", raw.len(), raw);
let reply = self.unmarshaller.unmarshall(raw.as_slice())?;
trace!("Reply: {:?}", reply);
Ok((&*reply).clone())
}
}